题意:有m个区间,区间有权值,求选择其中若干个不重叠区间后的最大能得到的权值。
DP:dp[i]表示挤完该时间段的牛奶后的所得的最大权值。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int start;
int end;
int efficiency;
}interval[1050];
int dp[1050];
bool cmp(node a,node b)
{
return a.end<b.end;
}
int main()
{
int i,j;
int n,m,r;
scanf("%d%d%d",&n,&m,&r);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&interval[i].start,&interval[i].end,&interval[i].efficiency);
interval[i].end=interval[i].end+r;//把休息时间也包含在该段时间中;
}
sort(interval+1,interval+1+m,cmp);
for(i=1;i<=m;i++)
{
dp[i]=interval[i].efficiency;
}//dp[i]表示第i个时间挤完后的最大产奶量;
int ans=0;
for(i=1;i<=m;i++)
{
for(j=i+1;j<=m;j++)
{
if(interval[j].start>=interval[i].end)
{
dp[j]=max(dp[j],dp[i]+interval[j].efficiency);
}
}
ans=max(ans,dp[i]);//注意点:是取max的dp[i],而不是dp[m],因为并不知道某个第i个时间段会不会挤;
}
printf("%d\n",ans);
return 0;
};