http://ac.jobdu.com/problem.php?pid=1499
给N个有开始结束的且有价格的项目 安排项目的顺序 使总价值最大
将项目按结束时间排序,
01背包 ,dp[i] 表示到第i个项目,最大的价值是多少
j从后往前遍历,更新符合 条件的的dp[i]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; struct data{ int ll,rr; int v; }s[10999]; int dp[10999]; int cmp(data x,data y){ return x.rr<y.rr; } int main() { int n; while(scanf("%d",&n)!=EOF){ int i,j; for(i=1;i<=n;i++){ scanf("%d%d%d",&s[i].ll,&s[i].rr,&s[i].v); dp[i]=0; }dp[0]=0; sort(&s[1],&s[1+n],cmp); dp[1]=s[1].v; for(i=2;i<=n;i++){ for(j=i-1;j>=1;j--){ if(s[j].rr<=s[i].ll)break; } dp[i]=dp[j]+s[i].v; dp[i]=max(dp[i],dp[i-1]); } printf("%d\n",dp[n]); } return 0; }