最近由于病毒的原因,poj都炸了,做题有点慢了,,,,,,这个题01背包变形,开始就想到了,但写的不对,后来又换了两种方法还是不对,看来前一个dp写对运气太多,,,最终还是看了别人的状态转移方程。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> using namespace std; const int maxm=1e6+10; const int maxn=1000+10; int dp[maxn]; struct note { int st,en,ef; bool operator <(note &p) { return (st<p.st)||(st==p.st&&en<p.en); } }a[maxn]; int n,m,r; int main() { while(~scanf("%d%d%d",&n,&m,&r)) { memset(dp,0,sizeof(dp)); for(int i=0;i<m;i++) { scanf("%d%d%d",&a[i].st,&a[i].en,&a[i].ef); a[i].en+=r; } sort(a,a+m); int ans=0; for(int i=m-1;i>=0;i--) { dp[i]=a[i].ef; for(int j=i+1;j<m;j++) if(a[j].st>=a[i].en) dp[i]=max(dp[i],a[i].ef+dp[j]); ans=max(ans,dp[i]); } printf("%d\n",ans); } return 0; }