P2766 最長不下降子串行問題

2022-03-04 03:51:56 字數 2240 閱讀 4419

«問題描述:

給定正整數序列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≤500

solution:

本題簡單dp+最大流。

第一問直接煞筆dp。

第二問求最多取出多少個長度為$x=max(f[i])$的子串行,因為每個數要麼不選要麼只選1次,這樣有上下界的題目,考慮拆點跑最大流咯,將每個數拆成$i\rightarrow i'$連流量為1,若$f[i]==1$則$s\rightarrow i$連流量為1,若$f[i]==x$則$i'\rightarrow t$連流量為1,若$f[i]==f[j]+1,j

第三問可以重複用$a_1$和$a_n$,那麼改變的就是與這兩點直接相關的邊的流量了,我們在第二問的答案基礎上,加入新邊,$1\rightarrow 1'$流量inf,$n\rightarrow n'$流量inf,$s\rightarrow 1$流量inf,若$f[n]==x$則$n'\rightarrow t$流量inf,再跑下最大流就好了。

(實際上本題第三問有bug,比如最長不下降子串行長度為1,那麼第三問答案就應該是inf了,inf不確定,於是乎出鍋咯!反正實踐證明沒這資料,嘿嘿嘿!>.@_@.<)

**:

/*

code by 520 -- 9.1

*/#include

#define il inline

#define ll long long

#define re register

#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)

using

namespace

std;

const

int n=1050,m=2500005,inf=0x7fffffff

;int n,a[n],f[n],s,t=1001

;int h[n],dis[n],to[m],net[m],w[m],cnt=1

;int

ans1,ans2;

il void add(int u,int v,int

c)il

bool

bfs()

return dis[t+1]!=-1;}

int dfs(int u,int

op) }

if(!flow) dis[u]=-1

;

return

flow;

}il

void

init()

add(t,t+1

,inf);

for(i,

1,n) for(j,1,i-1) if(f[i]==f[j]+1&&a[i]>=a[j]) add(i+n,j,1

);

while(bfs()) ans2+=dfs(s,inf);

printf(

"%d\n

",ans2);

add(n+1,t,inf),add(1,n+1,inf),add(n,n<<1

,inf);

if(f[n]==ans1) add(s,n,inf);

while(bfs()) ans2+=dfs(s,inf);

printf(

"%d\n

",ans2);

}int

main()

P2766 最長不下降子串行問題

話不多說,直接上思路。其實這就是一道dp動態規劃的經典問題,首先鏈上題目描述 問題描述 設有整數序列b1,b2,b3,bm,若存在 i1 i2 i3 in,且 bi1 bi2 bi3 bin,則稱b1,b2,b3,bm中有長度為n的不下降序列bi1,bi2,bi3,bin。求序列中最大不下降子串行長...

P2766 最長不下降子串行問題

通俗的,對於每個數只能取一次和取無限次,將點拆開加入邊約束 因為讓求最長上公升子串行的個數,所以當乙個數字被選擇時,它必須是最長上公升子串行的一部分 我們求出最長上公升子串行的 dp 陣列,當 x 可以連邊 y 當且僅當 y 在 dp 中可以從 x 轉移過來 這樣問題就顯然了,我們只需要求解 dag...

24題 P2766最長不下降子串行問題

網路流是個好東西,希望我也會。網路流?orz zsy 考慮我們是如何 dp 這個 lis 的。我們是倒著推,設定 dp i 代表以 i 為起點的 lis 是多少。轉移太顯然了 dp i max 1,data i le data j 想一想乙個合法的 lis 方案代表著什麼,代表著它是由這個式子乙個乙...