解题的思想用到了 类似最长递增子序的方法,先按起始时间升序排序,不断更新,到某点(包括改点)最大值
排序的目的:可以把看似二维的区间降到一维!!!!
O(n*n)
dp[i]=max(dp[i],dp[j]+node[i].v);
dp[i]放着的是包括i点,最大的价值

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct data
{
int b,e;
int v;
}node[1009];
int dp[1009];
bool cmp(data a,data b)
{
if(a.b==b.b)
return a.e<b.e;
else
return a.b<b.b;
}
int main()
{
int n,time;
while(scanf("%*d%d%d",&n,&time)!=EOF)
{
int i,j;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&node[i].b,&node[i].e,&node[i].v);
node[i].e+=time;
}
sort(&node[0],&node[n],cmp);
for(i=0;i<n;i++)
{
dp[i]=node[i].v;
}
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(node[i].b>=node[j].e)
{
if(dp[i]<dp[j]+node[i].v)
{
dp[i]=dp[j]+node[i].v;
}
}
}
}
int max=0;
for(i=0;i<n;i++)
{
if(max<dp[i])max=dp[i];
}
printf("%d\n",max);
}
}