大致题意:给N头牛的产奶时间段和产奶量,挤奶的人没帮一头牛挤完奶后要休息t个时间段,一旦开始为一头牛挤奶,就要一直到最后,问在m时间内最多的挤奶量。
方法:先将这些时间段按照开始时间排序,dp[i]代表的是从第i个时间段到最后的最多的挤奶量,dp[i]就是将在和第I个时间段没有交集的进行比较。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, t;
struct s{
int st, ed, val;
}pp[1100];
int dp[1100];
bool cmp(s a, s b){
return a.st < b.st;
}
int main(){
int i, j;
while(scanf("%d%d%d", &m, &n, &t) == 3){
memset(dp, -1, sizeof(dp));
for(i = 1; i <= n; i++){
scanf("%d%d%d", &pp[i].st, &pp[i].ed, &pp[i].val);
pp[i].ed += t;
}
m += t;
sort(pp+1, pp+1+n, cmp);
dp[n] = pp[n].val;
for(i = n-1; i >= 1; i--){
dp[i] = pp[i].val;
int temp = dp[i];
/*求解第I个时间段的最优解*/
for(j = i+1; j <= n; j++){
if(pp[i].ed <= pp[j].st){
dp[i] = max(dp[i], dp[j]+temp);
}
}
}
int res = -1;
for(i = 1; i <= n; i++)
res = max(res, dp[i]);
printf("%d\n", res);
}
return 0;
}