码迷,mamicode.com
首页 > 其他好文 > 详细

【codevs3012】线段覆盖4

时间:2017-10-24 17:12:18      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:mes   for   序列   ++   include   print   状态   表示   name   

这个题很好想到它的无后效性,但是我并不是很会写转移方程,看了别人的题解以后豁然开朗,序列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

标签:mes   for   序列   ++   include   print   状态   表示   name   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!