最長遞增子串行問題(最大流)

2021-07-13 12:27:29 字數 1932 閱讀 2770

description

給定正整數序列x1 , ... , xn 。

(1)計算其最長遞增子串行的長度s。

(2)計算從給定的序列中最多可取出多少個長度為s的遞增子串行。

(3)如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s的遞增子串行。

設計有效演算法完成(1)(2)(3)提出的計算任務。

input

多組資料輸入.

每組輸入第1 行有1個正整數n,表示給定序列的長度。接下來的1 行有n個正整數x1 ,... , xn。

output

每組輸出第1 行是最長遞增子串行的長度s。第2行是可取出的長度為s 的遞增子串行個數。第3行是允許在取出

的序列中多次使用x1和xn時可取出的長度為s 的遞增子串行個數。

sample input

43 6 2 5

sample output22

3題目出自nefu487

思路:第一問好求,直接dp就ok,然後第二三問就得用網路流的知識解決了。網上各種題解都說要拆點,我寫完了之後看了看覺得其實並沒有意義,拆點是自己本身這個點有權值的時候才需要去拆點,這一題主要是看子串行的建邊,與每個點自身的dp數值並木有關係,所以這題的建邊並不需要拆點,第二問就是從源點連邊到dp值為1的點,從dp值最大的點連邊到匯點,然後滿足dp相互關係的點之間連邊就ok,然後跑最大流就得到第二問結果。至於第三問,只是在第二問的基礎上把第乙個點如果和起點存在邊,將權值設為oo,最後乙個點如果和終點存在邊,將權值設為oo就好,其他無大改變,當然,如果第三問跑的最大流是無窮大了,這只有一種可能,就是所有的點的輸入權值都相等了,使得每個點都和源點和匯點連邊的權值成為了無窮大,所以答案自然就錯了,所以這時候應當把答案輸出成第二問計算出來的答案。

經過我的驗證的確不需要拆點   ╮(╯—╰)╭……

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

typedef long long ll;

const int oo=1e9;/**oo 表示無窮大*/

const int mm=111111111;/**mm 表示邊的最大數量,記住要是原圖的兩倍,在加邊的時候都是雙向的*/

const int mn=2010;/**mn 表示點的最大數量*/

int node,src,dest,edge;/**node 表示節點數,src 表示源點,dest 表示匯點,edge 統計邊數*/

int ver[mm],flow[mm],nex[mm];

int head[mn],work[mn],dis[mn],q[mn];

void prepare(int _node, int _src,int _dest)

void addedge( int u, int v, int c)

bool dinic_bfs()

return 0;

}int dinic_dfs( int u, int exp)

return 0;

}int dinic_flow()

int ans1=dinic_flow();

printf("%d\n",ans1);

prepare(n+2,0,n+1);///第三問建圖

for (int i=1; i<=n; i++)

else

for(int j=1; ja[j])

addedge(j,i,1);

}int ans2=dinic_flow();

if(ans2>=oo)///只有在所有資料都相等的情況下才會出現這種情況

printf("%d\n",ans1);

else

printf("%d\n",ans2);

}return 0;

}

最長遞增子串行問題

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.include define maxn 100 假設最多有100個元素 using namespace std int l maxn l i 表示元...

最長遞增子串行問題

給定正整數序列x1,xn。1 計算其最長遞增子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的遞增子串行。3 如果允許在取出的序列中多次使用x1和 xn,則從給定序列中最多可取出多少個長度為s的遞增子串行。設計有效演算法完成 1 2 3 提出的計算任務。由檔案input.txt提供輸入...

最長遞增子串行問題

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入資料為飛彈依次飛來的高度,所...