codevs 3027线段覆盖2

传送门

3027 线段覆盖 2

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
题目描述 Description

数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。

n<=1000

输入描述 Input Description

第一行一个整数n,表示有多少条线段。

接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci。

输出描述 Output Description

输出能够获得的最大价值

样例输入 Sample Input

3

1 2 1

2 3 2

1 3 4

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

数据范围

对于40%的数据,n≤10;

对于100%的数据,n≤1000;

0<=ai,bi<=1000000

0<=ci<=1000000

 【题目大意】求线段两两不覆盖且总价值和最大

【思路】dp

【code】

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct E
{
    int x,y,v;
}s[1002];
int n,ans,f[1002];
bool cmp(E a,E b)
{
    return a.y<b.y;
 } 
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].v);
    sort(s+1,s+n+1,cmp);
    for(int i=1;i<=n;i++)
    for(int j=0;j<i;j++)
    if(s[i].x>=s[j].y)
    f[i]=max(f[j]+s[i].v,f[i]);
    for(int i=1;i<=n;i++)
    ans=max(ans,f[i]);
    printf("%d\n",ans);
}

 

posted @ 2017-06-21 21:39  ANhour  阅读(225)  评论(0编辑  收藏  举报