题意:
给出一条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 100005
lld 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;
}