C语言实现,先对时间段进行排序,然后DP代表前N段的最大值
#include<stdio.h>
#include<string.h>
int my_max(int x,int y) {return x>y?x:y;}
typedef struct node{
int star;
int end;
int eff;
}NODE;
NODE que[1005];
int dp[1005];
int main()
{
int n,m,r,i,j,max;
NODE t;
while(scanf("%d %d %d",&n,&m,&r)!=EOF)
{
memset(que,0,sizeof(que));
memset(dp,0,sizeof(dp));
for(i=0;i<m;i++) scanf("%d %d %d",&que[i].star,&que[i].end,&que[i].eff);
for(i=0;i<m;i++)
{
for(j=i;j<m;j++)
{
if(que[i].star>que[j].star)
{
t=que[j];
que[j]=que[i];
que[i]=t;
}
}
}
for(i=0;i<m;i++)
{
max=0;
for(j=0;j<i;j++)
{
if(que[i].star-que[j].end>=r)
{
max=my_max(max,dp[j]);
}
}
dp[i]=max+que[i].eff;
}
max=0;
for(j=0;j<m;j++)//求出最大值
if(max<dp[j])
max=dp[j];
printf("%d\n",max);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10005;
struct node
{
int l,r,data;
bool operator<(const node& tmp) const{
if(l!=tmp.l)
return l<tmp.l;//如果区间开始不一样,则按开始为标准比较
else
return r<tmp.r;//如果区间开始一样,则按结束为标准比较
}
}p[maxn];
int dp[maxn];//表示选择到第M个区间 能获得的最大值
int main()
{
int n,m,r;
while(~scanf("%d%d%d",&n,&m,&r))
{
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].data);
dp[i]=0;//初始化DP
}
sort(p,p+m);//排序
int j;
for(int i=0;i<m;i++)
{
int maxx=0;
for(j=0;j<i;j++)
if(p[i].l-p[j].r>=r)//有一段r的距离
{
maxx=max(maxx,dp[j]);//找到这个区间前面的最大值
}
dp[i]=maxx+p[i].data;
}
int max=0;
for(j=0;j<m;j++)//求出最大值
if(max<dp[j])
max=dp[j];
printf("%d\n",max);
}
return 0;
}