codeforce Ilya and Roads (区间dp)

来源:互联网 发布:长门号战列舰模型淘宝 编辑:程序博客网 时间:2024/05/18 12:01

题意:

给出一条n个洞的路,现在又m个公司,第i个公司可以修补Li—Ri的这些洞,花费c的费用。允许修补区间重叠但是重叠部分的费用都要付给对应的公司。

题解:

题目化简为求区间1—n修补各个小区间并且修补至少k个洞的最小值。

做法比较巧妙看代码。

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;typedef long long lld;const int oo=0x3f3f3f3f;const lld OO=3e12+10;#define maxn 305#define maxm 100005lld dp[maxn][maxn];lld w[maxn][maxn];int main(){    int n,m,k,x,y,c;    while(scanf("%d %d %d",&n,&m,&k)!=EOF)    {        for(int i=0;i<=n;i++)            for(int j=0;j<=n;j++)                dp[i][j]=w[i][j]=OO;        for(int i=1;i<=m;i++)        {            scanf("%d %d %d",&x,&y,&c);            for(int j=x;j<=y;j++)                if(c<w[x][j])                    w[x][j]=c;        }        for(int i=0;i<=n;i++)            dp[i][0]=0;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=i;j++)            {                dp[i][j]=dp[i-1][j];                for(int k=1;k<=j;k++)                    dp[i][j]=min(dp[i-k][j-k]+w[i-k+1][i],dp[i][j]);            }        }        if(dp[n][k]>=OO) dp[n][k]=-1;        cout<<dp[n][k]<<endl;    }    return 0;}






0 0
原创粉丝点击