日常訓練20161013 括號表示式

2021-07-23 16:26:20 字數 1726 閱讀 9311

題意:統計長度為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 接下來...