通俗的,對於每個數只能取一次和取無限次,將點拆開加入邊約束
因為讓求最長上公升子串行的個數,所以當乙個數字被選擇時,它必須是最長上公升子串行的一部分
我們求出最長上公升子串行的 \(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 方案代表著什麼,代表著它是由這個式子乙個乙...