洛谷P2766最長不下降子串行

2021-08-20 04:46:46 字數 1259 閱讀 5459

第一問dp一下就好

第二問把乙個數分成兩個點,i,i+n,

i到i+n建一條邊容量為1的邊,表示這個數可以選一次

0為源點,2n+1為匯點,0,i建一條邊容量為1的邊表示有以i開頭長度為max的最長不下降序列,

i+n,hui建一條邊容量為1的邊表示有以i結尾長度為max的最長不下降序列,

跑最大流

第三問  殘餘網路(表示還剩那些數未選)

建立四條邊

add(

1,n+1,

1e9),add(huan,1,

1e9);

add(n,n+n,

1e9),add(n+n,hui,

1e9);(因為只有n前面有max-1個數小於它時,它才能做最後乙個數)

再跑一遍最大流+上上一題答案

#include#include#includeusing namespace std;

int num[1505],n,f[505],huan,hui;

int tov[20005],tow[20005],h[1505],nex[20005],tp=1;

int dis[1505],q[2000005],vis[1505];

void add(int x,int y,int w)

int dfs()}}

return vis[hui];

}int bfs(int x,int delta)

}return ret;

}int main()

int ans=0;huan=0,hui=2*n+1;

for(int i=1;i<=n;i++)

printf("%d\n",ans);

for(int i=1;i<=n;i++)

if(f[i]==1)

} for(int i=1;i<=n;i++)

for(int j=1;j=num[j]&&f[i]==f[j]+1)

}int ans2=0;

while(dfs())

printf("%d\n",ans2);

add(1,n+1,1e9),add(huan,1,1e9);add(n,n+n,1e9);

if(f[n]==ans) add(n+n,hui,1e9);

int ans1=0;

while(dfs())

ans1+=ans2;

printf("%d",ans1);

return 0;

}

P2766 最長不下降子串行問題

話不多說,直接上思路。其實這就是一道dp動態規劃的經典問題,首先鏈上題目描述 問題描述 設有整數序列b1,b2,b3,bm,若存在 i1 i2 i3 in,且 bi1 bi2 bi3 bin,則稱b1,b2,b3,bm中有長度為n的不下降序列bi1,bi2,bi3,bin。求序列中最大不下降子串行長...

P2766 最長不下降子串行問題

問題描述 給定正整數序列x1,xn 1 計算其最長不下降子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的不下降子串行。3 如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s的不下降子串行。程式設計任務 設計有效演算法完成 1 2 3 提出的計算任務。輸入...

P2766 最長不下降子串行問題

通俗的,對於每個數只能取一次和取無限次,將點拆開加入邊約束 因為讓求最長上公升子串行的個數,所以當乙個數字被選擇時,它必須是最長上公升子串行的一部分 我們求出最長上公升子串行的 dp 陣列,當 x 可以連邊 y 當且僅當 y 在 dp 中可以從 x 轉移過來 這樣問題就顯然了,我們只需要求解 dag...