code3027 线段覆盖2

dp

数据:d[i].a d[i].b d[i].v 分别表示第i条线段的起始点,结束点,价值

先按d[i].b排好序

dp[i]表示前i条线段的最大价值

方程:

dp[i]=max{ dp[i-1]

       d[i].v

       dp[p]+d[i].v  p<i,d[p].b<=d[i].a AND p最大

      }

这三种情况分别对应着:不放i,只放i,放前p个和i

因为dp是递增的,所以取满足d[p].b<=d[i].a(能放i)的最大的p即可

代码如下:

#include<iostream>
#include<algorithm>
#define Size 1005
using namespace std;

int n;
int dp[Size];
struct L{
    int a,b,v;
}d[Size];

bool cnt(L x,L y){
    return x.b<y.b; //b小的在前面,b一样随便
}

int main(){
    cin>>n;
    int x,y,v;
    for(int i=1;i<=n;i++){
        cin>>x>>y>>v;
        if(x>y)swap(x,y);
        d[i].a=x;
        d[i].b=y;
        d[i].v=v;
    } 

    sort(d+1,d+1+n,cnt);

    dp[0]=0;
    for(int i=1;i<=n;i++){
        dp[i]=max(dp[i-1],d[i].v);
        for(int p=i-1;p>0;p--){
            if(d[p].b<=d[i].a){
                dp[i]=max(dp[i],dp[p]+d[i].v);
                break;
            }
        }
        //cout<<dp[i]<<endl;
    }

    cout<<dp[n]<<endl;

    fclose(stdin);
    return 0;
}
时间: 2024-08-04 18:31:44

code3027 线段覆盖2的相关文章

cogs265.线段覆盖

265. 线段覆盖 ★★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比 时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=2000

codevs 1643 线段覆盖 3

1643 线段覆盖 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入 

COGS 265线段覆盖[线段树]

265. 线段覆盖 ★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=200000

CODEVS1643 线段覆盖3[贪心]

1643 线段覆盖 3  时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入

AGC017C Snuke and Spells(巧妙的线段覆盖模型)

题目大意: 给出n个球,每个球上都有数字,然后每次都进行如下操作 如果当前的球总共有k个,那么就把球上数字为k的所有球都消除掉 注意到,并不是每种情况都可以全部消光,所以你可以选择若干球,把它们标号改变,最后达到消光的目的 问最少需要改变几个球. 后面还跟着m个询问,每个询问会改变一个球的标号,问改变之后最少需要改变几个球才能消光. 题解: 大体先构建一个线段覆盖的模型,然后再证明这个模型是正确的 对于标号为i的球,覆盖线段[i-Ni, i](Ni为标号为i的球的个数) 每个球都做这样的覆盖,最

codevs 1214 线段覆盖

1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖.请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点.所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分). 输入描

CODEVS3037 线段覆盖 5[序列DP 二分]

3037 线段覆盖 5  时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~10^18,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大. 输入描述 Input Description 第一行一个整数n,表示有多少条线段. 接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点b

POJ 3347 Kadj Squares (线段覆盖)

题目大意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号 题目思路:线段覆盖,边长乘上2防止产生小数,求出每个正方形与x轴平行的对角线的起始x坐标,剩下的就是线段了. #include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cs

【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝