【codevs3012】線段覆蓋4
阿新 • • 發佈:2017-10-24
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);//提前按照右端點的大小排序 intpos=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