EDU 73 D (DP,合理猜想)

题意:

初始长度a[1-n],增加1需要花费b[1-n],问最小花费使所有ai != ai-1

解法:

一开始觉得当前的会影响后面的,然后发生一系列的连锁反应。不好判断状态。

其实可以猜想每个最多会被增加2次,就好写了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=3e5+7;
ll a[maxn], b[maxn];
ll dp[maxn][3];//到第i个当前增加j次的最小花费
const ll inf=0x3f3f3f3f3f3f3f3f; 
void solve(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&a[i], &b[i]);
    }
    dp[1][0]=0;
    dp[1][1]=b[1];
    dp[1][2]=b[1]*2;
    for(int i=2;i<=n;i++){
        for(int j=0;j<3;j++){
            dp[i][j]=inf;
            for(int k=0;k<3;k++){
                if(a[i-1]+k!=a[i]+j){
                    dp[i][j]=min(dp[i][j], dp[i-1][k]+b[i]*j);
                }
            }
        }
    }
    printf("%lld\n", min(dp[n][0], min(dp[n][1], dp[n][2])));
}
int main()
{
    freopen("in.txt","r",stdin);
    int t;scanf("%d",&t);
    while(t--){
        solve();
    }
}

 

posted @ 2020-04-10 14:54  aaaaaaaaaaaaaa123  阅读(132)  评论(0)    收藏  举报