Codeforces 313D Ilya and Roads 题解

xiaoxiao2021-02-28  98

题意

给定若干线段,每条线段可以覆盖一个连续整数区间,需要付出一定代价,问至少覆盖k个整数最少需要付出多少代价

思路

区间dp,在读入线段的时候,对连续一段区间的代价进行记录与更新,然后做区间dp,dp[i][j]表示到i为止覆盖j个区间需要付出的最小代价,dp[i][j]=max(dp[i][j],dp[i][k]+a[i-k+1][i]),a数组就是提前处理出的连续区间的代价,最后dp[n][k]就是答案

代码

#include <cstdio> #define INF 1000000000000000000LL long long co[301][301],ans[301][301]; int main() { long long n,m,k,l,r,c; scanf("%I64d%I64d%I64d",&n,&m,&k); for(long long i=0;i<=n;i++) for(long long j=1;j<=n;j++) { co[i][j]=INF; ans[i][j]=INF; } for(long long i=0;i<m;i++) { scanf("%I64d%I64d%I64d",&l,&r,&c); for(long long j=l;j<=r;j++) if(co[l][j]>c) co[l][j]=c; } for(long long i=1;i<=n;i++) for(long long j=1;j<=k&&j<=i;j++) { ans[i][j]=ans[i-1][j]; for(long long kk=1;kk<=j;kk++) if(ans[i][j]>ans[i-kk][j-kk]+co[i-kk+1][i]) ans[i][j]=ans[i-kk][j-kk]+co[i-kk+1][i]; } if(ans[n][k]!=INF) printf("%I64d\n",ans[n][k]); else printf("-1\n"); return 0; }
转载请注明原文地址: https://www.6miu.com/read-19941.html

最新回复(0)