题目链接: http://codevs.cn/problem/3027/
题意: 中文题目诶~
思路: dp
先给所有线段按照右端点值升序 sort 一下, 用 dp[i] 存储以第 i 条线段结尾的线段集合的最大价值,
那么动态转移方程式为: dp[i] = max(dp[i], dp[j] + gel[i].v), 其中 j < i 且 gel[i].l >= gel[j].r
注意 dp[n - 1] 不一定是最大, 维护一个 sol = max(sol, dp[i])
代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAXN = 1e3 + 10; 7 8 struct node{ 9 int l, r, v; 10 }gel[MAXN]; 11 12 int dp[MAXN], vis[MAXN]; 13 14 bool cmp(node a, node b){ 15 return a.r < b.r; 16 } 17 18 int main(void){ 19 int n, indx = 0, sol = 0; 20 scanf("%d", &n); 21 for(int i = 0; i < n; i++){ 22 scanf("%d%d%d", &gel[i].l, &gel[i].r, &gel[i].v); 23 } 24 sort(gel, gel + n, cmp); 25 for(int i = 0; i < n; i++){ 26 dp[i] = gel[i].v; 27 for(int j = 0; j < i; j++){ 28 if(gel[i].l >= gel[j].r){ 29 dp[i] = max(dp[i], dp[j] + gel[i].v); 30 } 31 } 32 sol = max(sol, dp[i]); 33 } 34 printf("%d ", sol); 35 return 0; 36 }