[wikioi]线段覆盖 2

http://wikioi.com/problem/3027/

# 有个小错误调了半天,最终发现sort(line, line+N)错了,后面那个是exclusive的,所以要line+N+1。
# 按照右端点从小到大排序。原因是循环结构中是i从1到n, i比较小的时候尽可能选右端点比较小的,这样才可以为后面的线段留下更大的空间。
# f[i]表示:算前i条线段时,选上第i条线段,能获得的最大价值。f[i]=max{f[j]}+c[i] (if 不重合)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <memory.h>
#define MAX(a, b) a>b?a:b
#define LEN 1005
using namespace std;

struct Line
{
    int left;
    int right;
    int value;
};

int N;
Line line[LEN];
int F[LEN];

bool comp(Line a, Line b)
{
    return a.right < b.right;
}

void init()     
{
    memset(F, 0, sizeof(F));
    memset(line, 0, sizeof(line));
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        scanf("%d%d%d", &line[i].left, &line[i].right, &line[i].value);
    }
    
}     

int main()
{
    init();
    sort(line, line+N, comp);
    int ans = 0;
    for (int i = 1; i <= N; i++)
    {
        F[i] = line[i].value;
        for (int j = 1; j < i; j++)
        {
            if (line[j].right <= line[i].left)
            {
                F[i] = MAX(F[j] + line[i].value, F[i]);
            }
        }
        ans = MAX(F[i], ans);
    }
    
    printf("%d\n", ans);
    return 0;
}

  

posted @ 2013-10-21 20:55  阿牧遥  阅读(253)  评论(0编辑  收藏  举报