首页 > 其他 > 详细

【codevs3012】线段覆盖4

时间:2017-10-24 16:57:09      阅读:261      评论:0      收藏:0      [点我收藏+]

这个题很好想到它的无后效性,但是我并不是很会写转移方程,看了别人的题解以后豁然开朗,序列dp多是以序列的第几位作为状态来进行转移的

#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n;
long long ans[1000010];//ans[i]表示i以前所有线段经过选择的答案,因为i以前都选好,所以无后效性,可以进行dp 
struct in
{
    int l,r,c;
}ter[1000010];
bool cmp(in a,in b)
{
    return a.r<b.r;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&ter[i].l,&ter[i].r,&ter[i].c);
        if(ter[i].l>ter[i].r)
            swap(ter[i].l,ter[i].r);//防止l大于r 
    }
    sort(ter+1,ter+1+n,cmp);//提前按照右端点的大小排序 
    int pos=0,i=1;
    for(pos=1;i<=n;pos++)//pos是枚举的位置,i是枚举的哪条线段 
    {
        ans[pos]=ans[pos-1];//假设没有选以pos为右端点的情况 
        while(ter[i].r==pos&&i<=n)
            ans[pos]=max(ans[pos],ans[ter[i].l]+ter[i].c),i++;
    }
    printf("%lld",ans[pos-1]);//多加出去的要减回来 
}

 

【codevs3012】线段覆盖4

原文:http://www.cnblogs.com/Loi-dfkdsmbd/p/7724239.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!