第一問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...