jzoj3845-简单题【dp】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3845-简单题【dp】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://jzoj.net/senior/#main/show/3845
題目大意
美麗的仙人掌定義為:
一個仙人掌,第iii到jjj號點(i<j)(i<j)(i<j)一定存在一條經(jīng)過了j?i+1j-i+1j?i+1個點的簡單路徑。
給出一張無向圖,選出最多的邊使得它是一個美麗的仙人掌。
解題思路
首先這張圖的基礎(chǔ)是一條鏈貫穿1~n1\sim n1~n,然后我們在上面加邊,我們發(fā)現(xiàn)若i~ji\sim ji~j之間加了邊,那么他們之間就不能再加邊了,問題轉(zhuǎn)換為給出若干條線段,選擇出最多的使它們互不重疊。
fif_ifi?表示到第iii個時的最多線段,那么有fi=max{fi?1,fj+1(j?>i)}f_i=max\{f_{i-1},f_j+1(j->i)\}fi?=max{fi?1?,fj?+1(j?>i)}
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int N=1e5+10; int n,m,f[N],ans; bool v[N]; vector<int> q[N]; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x>y) swap(x,y);if(x==y-1&&!v[y]) ans++,v[y]=1;else q[y].push_back(x);}for(int i=1;i<=n;i++){f[i]=f[i-1];for(int j=0;j<q[i].size();j++)f[i]=max(f[i],f[q[i][j]]+1);}printf("%d",f[n]+ans); }總結(jié)
以上是生活随笔為你收集整理的jzoj3845-简单题【dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jzoj3844-统计损失【树形dp,换
- 下一篇: 牛客-复读数组