水題大戰Vol 3 B DP搬運工2 計數DP

2022-01-10 17:37:59 字數 1010 閱讀 8438

給你\(n,k\),求有多少個\(1\)到\(n\) 的排列,恰好有\(k\)個數\(i\) 滿足\(a_,a_\) 都小於\(a_i\)。

一行兩個整數\(n,k\)。

一行乙個整數\(ans\)表示答案\(mod 998244353\)。

4 1

10 3

對於 \(25\%\) 的測試點,\(1 \leq n,k \leq 10\);

對於 \(50\%\) 的測試點,\(1 \leq n,k \leq 100\);

對於 \(100\%\) 的測試點,\(1 \leq n,k \leq 2000\);

保證資料有梯度

一道典型的計數\(dp\)題

我們設 \(f[i][j]\) 為考慮完 \(1 - i\) ,有 \(j\) 個位置滿足要求的方案數

對於 \(f[i-1][j]\) 如果我們向序列中插入乙個數 \(i\) 那麼會有兩種情況

1、新插入的\(i\)插入到原來滿足要求的\(j\)個位置旁邊或者數列的兩端,此時滿足要求的位置仍然是\(j\)個,方案數為\((j+1)\times 2\)

2、\(i\)插入到原數列的其它位置,此時滿足要求的位置變為 \(j+1\) 個,方案數為 \(i-(j+1) \times 2\)

#includeusing namespace std;

#define int long long

#define mian main

const int maxn=2e3+5;

const int mod=998244353;

int n,k,f[maxn][maxn];

signed mian()

} printf("%lld\n",f[n][k]);

return 0;

}

金題大戰Vol 0 B 序列 樹狀陣列

給定兩個長度為 n 的序列 a b 你需要選擇乙個區間 l,r 使得 a l a r 0 且 b l b r 0 最大化你選擇的區間長度。第一行乙個整數 n 第二行 n 個整數 a 1 a n 第三行n個整數 b 1 b n 一行乙個整數表示 max r l 1 保證至少有乙個區間滿足條件。5 2 ...

金題大戰Vol 0 D 二叉搜尋樹

有 n 個結點,第 i 個結點的權值為 i 你需要對它們進行一些操作並維護一些資訊,因此,你需要對它們建立一棵二叉搜尋樹。在整個操作過程中,第 i 個點需要被操作 x i 次,每次你需要從根結點一路走到第 i 個點,耗時為經過的結點數。最小化你的總耗時。第一行乙個整數 n 第二行 n 個整數 x1 ...

求因子和 百題大戰3

輸入正整數n 2 n 1000 計算並輸出n的所有正因子 包括1,不包括自身 之和。要求程式定義乙個facsum 函式和乙個main 函式,facsum 函式計算並返回n的所有正因子之和,其餘功能在main 函式中實現。int facsum int n 輸入輸入正整數n 2 n 1000 輸出輸出n...