突破口:只要发现DP对象是间歇M,便可发现本质是最大递增子序列。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long dp[1005];
struct mt
{
int s,t,e;
}m[1005];
bool cmp(mt x,mt y)
{
if(x.t!=y.t)
return x.t<y.t;
return x.s<y.s;
}
int main()
{
int N,M,R;
int i,j,k;
int ans=0,temp=0;
cin>>N>>M>>R;
for(i=0;i<=M-1;i++)
cin>>m[i].s>>m[i].t>>m[i].e;
sort(m,m+M,cmp);
// for(i=0;i<=M-1;i++)
// cout<<m[i].s<<' '<<m[i].t<<' '<<m[i].e<<endl;
for(i=0;i<=M-1;i++)
{//cout<<i<<endl;
if(m[i].t>N)
break;
if(i==0)
ans=dp[i]=m[i].e;
else
{
temp=0;
for(j=i-1;j>=0;j--)
{
if(m[i].s-m[j].t>=R)
{
if(temp<dp[j])
temp=dp[j];
}
}
dp[i]=m[i].e+temp;//cout<<m[i].e+temp<<endl;
if(ans<dp[i])
ans=dp[i];
}
}
// for(i=0;i<=M-1;i++)
// cout<<dp[i]<<endl;
cout<<ans<<endl;
return 0;
}
Tips:DP需确定准对象。