题意:
有m个时间段,在n时间内可以挤奶,挤一次之后休息r时间,问最多挤多少。
思路:分段dp问题:这道题给出了一种分段dp的思想。dp[i]表示第i段时间所挤的奶。
注意:最后的求最大,因为有可能最后一种s太大而遍历不到。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max = 1005;
class Node
{
public:
int s,e,v;
}time[Max];
int cmp(Node a,Node b)
{
return a.s < b.s;
}
int n,m,r;
__int64 dp[Max];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&r);
for(int i = 0;i < m; i++){
scanf("%d%d%d",&time[i].s,&time[i].e,&time[i].v);
time[i].e += r;
}
sort(time,time+m,cmp);
memset(dp,0,sizeof(dp));
for(int i = 0;i < m; i++){
dp[i] = time[i].v;
for(int j = 0;j < i; j++){
if(time[j].e <= time[i].s){
dp[i] = max(dp[i],dp[j] + time[i].v);
}
}
}
__int64 M = 0;
for(int i = 0;i < m; i++) //防止最后一种情况没有遍历
M = max(M,dp[i]);
printf("%I64d\n",M);
return 0;
}