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<<"\n"; } return 0; }