1. 程式人生 > >【codevs3012】線段覆蓋4

【codevs3012】線段覆蓋4

pri 回來 dev bsp while return iostream space n)

這個題很好想到它的無後效性,但是我並不是很會寫轉移方程,看了別人的題解以後豁然開朗,序列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