题意: 总共 N 小时 , M 个产奶时段, 每次产奶后需要休息  R 小时。

    给你 M 组数据, 每组数据 包括 :时段的开始时间点, 结束时间点, 时间段产奶量。

思路: 将所有时间段 按 结束时间点 从小到大 排序。

              dp[i] 是以 第 i 个时间段结束时的最大产奶量 (排序后),有点像最大序列和,不过需要考虑两个时间的休息时段,即 j 时间段 发生后 i 时间段 能否发生。

for(i=1; i<=m; i++) // 不断 更新 dp[i] 的最优值 
 {
 dp[i] = c[i].v; 

  for(j=1; j<i; j++) // 和前面的比较(更新后) 更新dp[i]  
  {
    if((c[j].e+r) <= c[i].s) // 如果 j  时间段 发生后 i 时间段 能发生, 则更新 dp[i]
    dp[i] = max(dp[i],dp[j]+c[i].v);       
  }
  
   if(dp[i] > ans)
     ans = dp[i]; // 记录最大值结果 
    }
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

typedef struct worktime
{
    int s, e, v;
} WT;
WT c[2010];
int dp[1010];
int main()
{
    int i, j, n, m, r;
    scanf("%d %d %d",&n,&m,&r);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&c[i].s,&c[i].e,&c[i].v);
    }

    for(i=1; i<m; i++)
        for(j=i+1; j<=m; j++)
        {
            if(c[i].e > c[j].e)
            {
                WT temp;
                temp = c[i];
                c[i] = c[j];
                c[j] = temp;
            }
        }

    memset(dp,0,sizeof(dp));

    int ans = -1;

    for(i=1; i<=m; i++) // 不断 更新 dp[i] 的最优值
    {
        dp[i] = c[i].v;

        for(j=1; j<i; j++) // 和前面的比较(更新后) 更新dp[i]
        {
            if((c[j].e+r) <= c[i].s)
                dp[i] = max(dp[i],dp[j]+c[i].v);
        }

        if(dp[i] > ans)
            ans = dp[i]; // 记录最大值结果
    }

    printf("%d",ans);
    return 0;
}