Codeforces Round 73 D dp

痛定思痛。 2024-04-20 08:36 144阅读 0赞

链接:http://codeforces.com/contest/1221/problem/D

题意:有一排栅栏,每个栅栏有一个高度和升高一单位所需money,求让相邻两个栅栏高度互不相同的最小花费。

题解:每个栅栏被修改只有三种情况,分别是修改0,修改1,修改2 。然后,背包。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M=3e5+50;
  4. #define ll long long
  5. ll n,m,a[M],b[M],dp[M][3];
  6. int main(){
  7. int T;scanf("%d",&T);
  8. while(T--){
  9. scanf("%d",&n);
  10. for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
  11. dp[1][0]=0;
  12. dp[1][1]=b[1];
  13. dp[1][2]=b[1]+b[1];
  14. for(int i=2;i<=n;i++){
  15. for(int j=0;j<=2;j++){
  16. dp[i][j]=1e18;
  17. for(int k=0;k<=2;k++){
  18. if(a[i]+j!=a[i-1]+k){
  19. dp[i][j]=min(dp[i][j],dp[i-1][k]+b[i]*j);
  20. }
  21. }
  22. }
  23. }
  24. printf("%lld\n",min(dp[n][0],min(dp[n][1],dp[n][2])));
  25. }
  26. return 0;
  27. }

发表评论

表情:
评论列表 (有 0 条评论,144人围观)

还没有评论,来说两句吧...

相关阅读