首页 > 其他 > 详细

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

时间:2019-11-19 18:38:35      阅读:77      评论:0      收藏:0      [点我收藏+]

链接: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;
}

 

 

 

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

原文:https://www.cnblogs.com/Yokel062/p/11891161.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!