[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;

}

  

你可能感兴趣的:(IO)