http://codevs.cn/problem/3027/
根据线段覆盖1的解,这一题还是比较好想的。
右端点排序,找出不覆盖的两天线段价值是前一个计算好的最大值加上后一个的值。
#include<iostream>
using namespace std;
struct MyStruct
{
int a;
int b;
int value;
}jiegouti[1050];
int main()
{
int value[1050] = { 0 };
int n,a,b;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a >> b >> jiegouti[i].value;
if (a>b)
{
jiegouti[i].b = a;
jiegouti[i].a = b;
}
else
{
jiegouti[i].b = b;
jiegouti[i].a = a;
}
}
//排序用自己顺手的就好
for (int i = 0; i < n-1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (jiegouti[i].b>jiegouti[j].b)
{
swap(jiegouti[i],jiegouti[j]);
}
}
}
//这里需要注意一下啊,比较从1开始0的值需要自己赋给
value[0] = jiegouti[0].value;
for (int i = 1; i < n; i++)
{
//这里,如果所有的线段全部重合,那么他的价值等于它本身
int max = jiegouti[i].value;
for (int j = 0; j < i; j++)
{
//状态转移方程
if (jiegouti[i].a>=jiegouti[j].b&&value[j]+jiegouti[i].value>max)
{
max = value[j] + jiegouti[i].value;
}
}
value[i] = max;
}
int max = -9999999;
for (int i = 0; i < n; i++)
{
if (max<value[i])
{
max = value[i];
}
}
cout << max << endl;
system("pause");
return 0;
}