P2766 最長不下降子串行問題

2022-09-20 22:48:14 字數 1183 閱讀 7516

通俗的,對於每個數只能取一次和取無限次,將點拆開加入邊約束

因為讓求最長上公升子串行的個數,所以當乙個數字被選擇時,它必須是最長上公升子串行的一部分

我們求出最長上公升子串行的 \(dp\) 陣列,當 \(x\) 可以連邊 \(y\) 當且僅當 \(y\) 在 \(dp\) 中可以從 \(x\) 轉移過來

這樣問題就顯然了,我們只需要求解 \(dag\) 上的最長鏈個數即可

具體的連邊方法,設最長上公升子串行長度為 \(k\)

#include#include#include#include#include#include#includeusing namespace std;

namespace oi

template inline int min(const t &a,const t &b)

const int n=1005,m=4005;

int head[n],ver[m],nxt[m],flow[m],tot=1;

inline void add(int &x,int &y,int z)

inline void adds(int x,int y,int z)

int n,s,t;

int dis[n],cur[n];

int g[505];

inline int bfs()

}} return dis[t];

} int dfs(int x,int f)

}} if(!used) dis[x]=0;

return used;

} inline int dinic()

const int top=500;

template inline void ckmax(t &a,const t &b)

}} printf("%d\n",dinic());

for(int i=2;i<=tot;i=-~-~i)

adds(1,2,0x3f3f3f3f);

adds((n<<1)-1,n<<1,0x3f3f3f3f);

adds(2,t,0x3f3f3f3f);

if(f[n]==res) adds(s,(n<<1)-1,0x3f3f3f3f);

printf("%d\n",dinic()); }}

signed main()

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 提出的計算任務。輸入...

24題 P2766最長不下降子串行問題

網路流是個好東西,希望我也會。網路流?orz zsy 考慮我們是如何 dp 這個 lis 的。我們是倒著推,設定 dp i 代表以 i 為起點的 lis 是多少。轉移太顯然了 dp i max 1,data i le data j 想一想乙個合法的 lis 方案代表著什麼,代表著它是由這個式子乙個乙...