思路 :有点类似 逆向背包DP , 因为这些事件发生后是对后面的时间有影响。
所以,我们 进行逆向DP,具体 见代码实现。
#include<bits/stdc++.h> using namespace std; #define maxn 1000000 #define ll long long struct node { int start,len; ll w; bool operator<(const node &b)const { return start>b.start; } } a[maxn]; ll n,dp[maxn+101]; int book[maxn]; int main() { scanf("%lld",&n); for(int i=1; i<=n; i++) { scanf("%d%lld%d",&a[i].start,&a[i].w,&a[i].len); book[a[i].start]=i; } for(int i=maxn; i>=1; i--) { dp[i]=dp[i+1]; if(book[i]!=0) { if(i+a[book[i]].len>maxn) { dp[i]=max(dp[i],a[book[i]].w); continue; } dp[i]=max(dp[i],dp[i+a[book[i]].len]+a[book[i]].w); } } printf("%lld\n",dp[1]); return 0; }