1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4
5 using namespace std;
6
7 const int maxn = 1003;
8
9 struct Line{
10 int start;
11 int end;
12 int value;
13 }l[maxn];
14 //确定一个结构体,用结构体定义数组,让其里面存储线段的起点、终点与线段长度
15
16 int dp[maxn];//此数组储存关于n条线段的最大价值
17
18 int cmp(const Line &a ,const Line &b)//用来sort排序
19 {
20 return a.end < b.end;//从小到大排序 返回终点较小的
21 }
22 int main()
23 {
24 int n;
25 scanf("%d",&n);
26 for(int i = 1; i <= n; i++)
27 {
28 int a,b,c;//a,b,c分别为线段起点、终点及长度
29 scanf("%d%d%d", &a, &b, &c);
30 l[i].start = a;
31 l[i].end = b;
32 l[i].value = c;
33 //将每条线段的起点、终点、长度储存进去
34 }
35 sort (l+1, l+n+1,cmp);//将l数组进行从小到大排序(按照左端点进行升序排序)
36 //l为地址,+1、+n+1为数组下标,注意左闭右开
37 for(int i = 1; i <= n; i++)
38 {
39 dp[i] = max (dp[i-1], l[i].value);//首先先进行第一次更新
40 for(int p = i - 1; p >= 1; p--)
41 {
42 if (l[p].end <= l[i].start)//p表示在i左边的那条线段,注意这是一个开区间,所以是"<="
43 dp[i] = max (dp[i], dp[p] + l[i].value);//进行第二次更新
44 }
45 }
46 printf("%d",dp[n]);//输出dp[n]
47 return 0;
48 }