CF1221D Make The Fence Great Again

这题我们发现其实是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

 

posted @ 2020-02-08 11:37  朝暮不思  阅读(207)  评论(0编辑  收藏  举报