codevs3027(dp)

题目链接: 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 }
View Code
原文地址:https://www.cnblogs.com/geloutingyu/p/7384296.html