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(); } }

浙公网安备 33010602011771号