#include<stdio.h>
struct inf
{
int left;
int right;
int v;
int max;
};
int main()
{
int n,ans=0;
inf num[1001];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&num[i].left,&num[i].right,&num[i].v);
num[i].max=num[i].v;
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(num[i].left>num[j].left)
{
inf temp;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
}
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(num[i].left>=num[j].right)
num[i].max=num[i].max>(num[i].v+num[j].max)?num[i].max:(num[i].v+num[j].max);
ans=num[i].max>ans?num[i].max:ans;
}
}
printf("%d\n",ans);
}
先将所有线段按照b的升序排序。
然后进行DP,同时维护f[i]的性质。
动规方程:f[l[i].b]=max(f[l[i].b],f[l[i].a]+l[i].c);(l[i].a表示左端点,l[i].b表示右端点)f[i]表示到坐标为i的点时取得线段价值最大值。
在动规的同时维护此性质:f[i]恒为max(f[j])(0<j<=i)