題意:統計長度為n(
2≤n≤
200)
,深度為k(
1≤k≤
150)
的合法括號表示式的數目。
法一:用f[
i][j
][k]
表示前i位,最深深度為
j ,當前深度為
k的方案數。列舉第i+
1 位左括號還是右括號,o(
1)轉移。總複雜度o(
nd2)
。
var
f:array[0..201,-1..151,-1..151] of int64;
n,d,i,j,k:longint;
begin
assign(input,'bracket.in');reset(input);
assign(output,'bracket.out');rewrite(output);
read(n,d);
fillchar(f,sizeof(f),0);
f[0][0][0]:=1;
for i:=0 to n-1 do
for j:=0 to d do
for k:=0 to d do
begin
inc(f[i+1][j][k-1],f[i][j][k]);
inc(f[i+1][j+ord(k+1>j)][k+1],f[i][j][k]);
end;
writeln(f[n][d][0]);
close(input);close(output);
end.
法二:f[
i][j
] 表示
i 個位置,深度小於等於
j的方案數,為了避免重複計數,列舉分割點的時候強制給右半段套上乙個括號(其實就是列舉當前段最右邊括號的左括號在**)。狀態o(
n2) ,記憶化搜尋,總複雜度o(
n2) 。
var
f:array[0..201,0..151] of int64;
n,d,i,j:longint;
function
calc
(n,d:longint):int64;
vari:longint;
begin
if (n=0) then
exit(1);
if (d=0) then
exit(0);
if (f[n][d]>0) then
exit(f[n][d]);
i:=0;
while (ido
begin
inc(f[n][d],calc(i,d)*calc(n-i-2,d-1));
inc(i,2);
end;
exit(f[n][d]);
end;
begin
assign(input,'bracket.in');reset(input);
assign(output,'bracket.out');rewrite(output);
read(n,d);
if (n and
1=1)
then writeln(0)
else writeln(calc(n,d)-calc(n,d-1));
close(input);close(output);
end.
日常訓練 壓縮
巨大的文字往往令人頭疼,特別是文字內容有大量重複的情況下,巨大的文字不便於運輸和閱讀,於是我們提出了noip nonsense obivous index pattern 荒謬的顯然索引法 一種 有效的 壓縮文字的方法。noip壓縮後的格式很特別,乙個文字壓縮後由若干個單元組成,每個單元由3部分組成...
日常訓練 Tree
j 對於h u j 時間複雜度的證明也是比較經典了,每次列舉的是sz eu s zev 相當於每次從a,b 中各任選一點,它們的lc a 為 u 這樣的點對列舉不會重複,因此總的時間複雜度為o n2 include include include include include using name...
日常訓練 mod
給定 p 1,p 2,p n,b 1,b 2,b m 求滿足 x mod p 1 equiv a 1,x mod p 2 equiv a 2,x mod p n equiv a n 的 x 對 b 1,b 2,b m 取模的結果.第一行兩個整數 n,m 接下來 n 行,每行有乙個整數 a i 接下來...