注:題目描述有誤,本題求的是最長不下降子串行
方案無限多時輸出 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: 複製
43 6 2 5
輸出樣例#1: 複製
223
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 提出的計算任務。輸入...