網路流24題 最長不下降子串行問題(最大流)

2021-09-25 18:38:56 字數 1802 閱讀 4006

題目鏈結

這個題目有三個要求出來的

計算其最長不下降子串行的長度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 的不下降子串行。思路分析 題意首先就很坑 注意第...