题目:
题解:
将所有线段按照右端点排序,划分阶段;
dp[i]表示第i条线段是最后选择的线段时的最大价值;
for 1~i
如果j线段的右端点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10000+50;
int dp[N],ans,n;
struct node{
int l,r,val;
}xd[N];
bool cmp(node a,node b){
return a.r<b.r;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&xd[i].l,&xd[i].r,&xd[i].val);
}
sort(xd+1,xd+n+1,cmp);
for(int i=1;i<=n;i++){
dp[i]=xd[i].val;
for(int j=1;j<i;j++){
if(xd[j].r<=xd[i].l){
dp[i]=max(dp[i],dp[j]+xd[i].val);
}
}
ans=max(ans,dp[i]);
}
printf("%d",ans);
}