zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/Yokel062/p/11891161.html
Copyright © 2011-2022 走看看