POJ3616
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int dp[10050]; struct sa{ int x,y,sum; }p[10050]; //我觉得结构体的基础知识你得复习下 int cmp(const sa a,const sa b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x; } //比较函数 int main(){ int n,m,t; scanf("%d%d%d",&n,&m,&t); //一个整个时间段,一个是 能挤几次,最后一个是要恢复的时间 for(int i=0;i<m;i++){ scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].sum); //每次挤的时间区间和能挤出的量 p[i].y+=t; //把延续的时间一加,就当这个时间段都只能做一个了 } sort(p,p+m,cmp); //这个排序要看上面的cmp,挺值得学习的 //另外这个排序对于这个题也挺关键的 for(int i=m-1;i>=0;i--){ dp[i]=p[i].sum; //嗯因为是在外面定义的所以全是零喽 //至于i的开始我觉得你得去问问你的排序怎么排的 for(int j=i+1;j<m;j++) if(p[j].x>=p[i].y){ dp[i]=max(dp[i],dp[j]+p[i].sum); } //转印方程还得思考思考 //类比才是王道,直接类比个地下城的刷图,固定下时间就ok //我觉得这转移方程也不好想吖 } int maxx=0; for(int i=0;i<m;i++) maxx=max(maxx,dp[i]); cout<<maxx<<endl; return 0; }