码迷,mamicode.com
首页 > 其他好文 > 详细

CF1221D Make The Fence Great Again

时间:2020-02-08 13:46:36      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:hid   typedef   splay   范围   const   ons   enc   更改   血的教训   

这题我们发现其实是dp的状态机模型,虽然我们发现一个数字可以更改多次

但是我们只要求相邻的不同,所以一个数字最多只跳两次,因为这样就能保证相邻不同,越多没有意义且费钱

所以我们只需三个for循环就能转移

另外本题有几个注意点

1.数据范围很大,所以不能用cin

2.memset会超时,血的教训,在大量清空的情况下最好用for循环控制

3.会爆int,这个题目有显示。

技术图片
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map> 
#include<vector> 
using namespace std;
typedef  long long ll;
const int mod=1e9+7;
const int N=5e5+10;
const ll inf=1e18+10;
ll a[N],b[N];
ll f[N][3];//前i位当前位置修改几次 
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++){
            scanf("%lld%lld",&a[i],&b[i]);
        }
        for(i=0;i<=n;i++){
            for(int j=0;j<3;j++)
            f[i][j]=inf;
        }
        f[0][0]=0;
        int j,k;
        for(i=1;i<=n;i++){
            for(k=0;k<3;k++){
                for(j=0;j<3;j++){
                    if(a[i-1]+j!=a[i]+k){
                        f[i][k]=min(f[i-1][j]+k*b[i],f[i][k]);
                    }
                }
            }
        }
        printf("%lld\n",min(min(f[n][0],f[n][1]),f[n][2]));
    }
}
View Code

 

CF1221D Make The Fence Great Again

标签:hid   typedef   splay   范围   const   ons   enc   更改   血的教训   

原文地址:https://www.cnblogs.com/ctyakwf/p/12275867.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!