Codeforce 1221D Make The Fence Great Again (围栏great,找状态dp)

链接:http://codeforces.com/contest/1221/problem/D

题意:长度为n的序列,要使得相邻的值都不相同,可对每一个值多次加1,每次的加1的cost为cost【i】,求使得满足条件的最小代价。

题解:分类讨论可以发现,对于每一个值来说,最多也就会加2,即对前i个最后一个有三种状态,可进行dp,状态i可由i-1推出。

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
const long long inf=1e18;
int T, n;
long long dp[maxn][3], cost[maxn], a[maxn];
 
int main(){
    ios::sync_with_stdio(false), cin.tie(0);
    //freopen("in.txt", "r", stdin);
    for(cin>>T; T--; ){
        cin>>n;
        for(int i=1; i<=n; i++) cin>>a[i]>>cost[i];
        for(int i=1; i<=n; i++)
            for(int k=0; k<=2; k++)
                dp[i][k]=inf;
        for(int i=1; i<=n; i++)
            for(int k1=0; k1<=2; k1++)
                for(int k2=0; k2<=2; k2++)
                    if(i==1 || a[i]+k2!=a[i-1]+k1)
                        dp[i][k2]=min(dp[i][k2], dp[i-1][k1]+cost[i]*k2);
        long long ans=min(dp[n][0], min(dp[n][1], dp[n][2]));
        cout<<ans<<"
";
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Yokel062/p/11891161.html