洛谷P2766 最長遞增子串行問題

2022-03-01 22:18:16 字數 2189 閱讀 7365

注:題目描述有誤,本題求的是最長不下降子串行

方案無限多時輸出 n

網路流求方案數,長見識了

第一問:

dp同時得到f[i] 表示 以第i個數為開頭的最長不下降子串行長度

第二問:

每個點拆出2個點 i<<1,i<<1|1,之間連流量為1的邊

如果f[i]==最長長度,源點向i<<1連流量為1的邊

如果f[i]==1,i<<1|1向匯點連流量為1的邊

如果 i

這樣每一條增廣路就是乙個方案

第三問:

源點向1<<1,向n<<1連的邊,

1<<1|1,n<<1|1向匯點連的邊,

1<<1與1<<1|1,n<<1與n<<1|1 之間的邊

流量改為inf

小錯誤:

特判序列為單調下降序列

因為 源點會向每個1<<1連流量為inf 的邊

1<<1|1又會向匯點連inf的邊

這樣導致第三問跑出負無窮,第9、10 測試點掛了的可能是這個原因

#include#include

#include

#include

#include

using

namespace

std;

#define n 1011

#define m 300001

const

int inf=2e9;

intn;

int a[501

];int

max_len;

int f[501

];int tot=1

;int front[n],to[m<<1],nxt[m<<1],val[m<<1],from[m<<1

];int

lev[n],num[n];

intpath[n];

intcur[n];

intsrc,decc;

void read(int &x) }

void

dp()

cout

<}void add(int u,int v,int

w)void

build()

void

rebuild()

bool

bfs()}}

return lev[src]!=decc;

}int

augment()

now=decc;

while(now!=src)

return

flow;

} void

isap()

memset(num,

0,sizeof

(num));

for(int i=src;i<=decc;++i) num[lev[i]]++;

int flow=0

;

int now=src,t;

while(lev[src]bool advanced=false

;

for(int i=front[now];i;i=nxt[i])

}if(!advanced)

}cout

<<'\n'

<}int

main()

build();

isap();

rebuild();

isap();

}

«問題描述:

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

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

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

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

«程式設計任務:

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

輸入格式:

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

輸出格式:

第1 行是最長遞增子串行的長度s。第2行是可取出的長度為s 的遞增子串行個數。第3行是允許在取出的序列中多次使用x1和xn時可取出的長度為s 的遞增子串行個數。

輸入樣例#1: 複製

4

3 6 2 5

輸出樣例#1: 複製

2

23

n\le 500n≤500

洛谷P2766最長不下降子串行

第一問dp一下就好 第二問把乙個數分成兩個點,i,i n,i到i n建一條邊容量為1的邊,表示這個數可以選一次 0為源點,2n 1為匯點,0,i建一條邊容量為1的邊表示有以i開頭長度為max的最長不下降序列,i n,hui建一條邊容量為1的邊表示有以i結尾長度為max的最長不下降序列,跑最大流 第三...

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 提出的計算任務。輸入...