http://poj.org/problem?id=1201
第一次做差分约束 看了别人的解析 挺详细的
出自http://user.qzone.qq.com/289065406/blog/1307063918
然后自己根据自己的理解 写了代码 建议去看上面链接处的解析 非常不错
#include<iostream> #include<cmath> #include<string> #include<algorithm> #include<queue> #include<cstring> #include<cstdio> using namespace std; const int N=50005; int ans[N]; struct node { int l,r,k; }mem[N]; int main() { int n; while(scanf("%d",&n)!=EOF) { int M=0; for(int i=0;i<n;++i) { scanf("%d %d %d",&mem[i].l,&mem[i].r,&mem[i].k); --mem[i].l; M=max(M,mem[i].r); } memset(ans,0,sizeof(ans)); bool OK=false; while(!OK) { OK=true; for(int i=0;i<n;++i) { if(mem[i].l<0) { if(mem[i].k>ans[mem[i].r]) {OK=false;ans[mem[i].r]=mem[i].k;} } else { if(ans[mem[i].l]+mem[i].k>ans[mem[i].r]) {OK=false;ans[mem[i].r]=ans[mem[i].l]+mem[i].k;} } } for(int i=0;i<M;++i) { if(ans[i+1]<ans[i]) {OK=false;ans[i+1]=ans[i];} } for(int i=M;i>0;--i) { if(ans[i-1]<ans[i]-1) {OK=false;ans[i-1]=ans[i]-1;} } } printf("%d\n",ans[M]); } return 0; }