问题描述
数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。n<=1000。
第一行一个整数n,表示有多少条线段。
接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci。
样例输入
3
1 2 1
2 3 2
1 3 4
样例输出
4
分析
这道题属于最长上升序列型的动态规划。
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1000 + 10
int n,dp[N];
struct Node {
int left,right,value;
bool operator < (const Node& b) const {//这里是比较函数,sort时用到
return left < b.left;
}
} a[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i].left >> a[i].right >> a[i].value;
sort(a + 1,a + n + 1);//按照左端的坐标从小到大排
int ans = 0;
for(int i = 1; i <= n ;i++) {
dp[i] = a[i].value;
for(int j = 1; j < i; j++)//往前找
//如果不重合
if(a[i].left >= a[j].right) dp[i] = max(dp[i],dp[j] + a[i].value);
ans = max(ans,dp[i]);
}
cout << ans << endl;
return 0;
}