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;
}
浙公网安备 33010602011771号