Codeforces 313D Ilya and Roads 题解

来源:互联网 发布:ubuntu netstat不存在 编辑:程序博客网 时间:2024/05/18 03:02

题意

给定若干线段,每条线段可以覆盖一个连续整数区间,需要付出一定代价,问至少覆盖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 1000000000000000000LLlong 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;}
原创粉丝点击