題目鏈結
這個題目有三個要求出來的
計算其最長不下降子串行的長度s。
計算從給定的序列中最多可取出多少個長度為s的不下降子串行
如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s的不下降子串行
自己的想法
對於 問題1 直接用那個動態規劃去跑下,就求出答案len了,這是會用到乙個dp陣列, 這是有用的
對於 問題2 容易想到的新加乙個源點s和匯點t,如果dp[i] = 1 就連一條s -> i的邊, dp[i] = len 就連一條i -> t的邊, 再對於任意i ,j 如果a[i]>=a[j] && dp[j]+1==dp[i], 就在連一條邊, 這些邊的容量都為1
對於 問題3 就直接依照要求, 加連一條s -> 1的邊, 當dp[n] == ans 時, 加連一條n -> t的邊, 容量為無窮大
但這樣做的話,當陣列只有乙個數時, 第三問,要特判下才能過了
只能靠特判才能a題啊
#include
const
int maxn =
505;
const
int inf =
0x3f3f3f3f
;using namespace std;
typedef
long
long ll;
struct note
e[maxn * maxn *2]
;int head[maxn]
, cnt;
int n, s, t;
int dp[maxn]
, a[maxn]
, ans;
void
add(
int u,
int v,
int w)
; head[u]
= cnt++
; e[cnt]
=(note)
; head[v]
= cnt++;}
int level[maxn]
;bool bfs()
}}return level[t]!=-
1;}int
dfs(
int u,
int delta)}if
(flow ==0)
level[u]
= inf;
return flow;
}int
dinic()
return maxflow;
}int
main()
}}printf
("%d\n"
, ans)
;for
(int i =
1; i <= n; i++)}
}int res =
dinic()
;printf
("%d\n"
, res)
;add
(s,1
, inf)
;//新增
if(dp[n]
== ans)
add(n, t, inf)
;//新增邊
if(ans ==1)
printf
("%d\n"
, res)
;else
return0;
}
網路流24題之最長不下降子串行
對於第一問直接n 2dp計算 第二問建圖跑網路流 第三問將起始與結尾流量開大 建邊的時候要嚴格按照子串行求法建 by 大奕哥 1 include2 using namespace std 3const int n 10005 4 inthead n d n f n a n 5int n,m,cnt ...
網路流24題 最長不下降子串行問題
luogu 2766 最長不下降子串行問題 傳送門第一問 o n 2 的dp求lis 為了下面敘述方便,我們將dp過程講一遍 子狀態 dp i 表示以a i 結尾的lis長度 初始條件 dp i 1 狀態轉移方程 dp i dp j 1 j 第二問 我們發現若a j 加上a i 可以構成乙個不下降子...
網路流24題 最長不下降子串行問題
傳送門 here 題意 給定正整數序列 x 1,x n 1 計算其最長不下降子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的不下降子串行。3 如果允許在取出的序列中多次使用 x 1 和 x n 則從給定序列中最多可取出多少個長度為 s 的不下降子串行。思路分析 題意首先就很坑 注意第...