Description
Input
Output
Sample Input
7 3
Sample Output
4
Data Constraint
Solution
这是一道经典的DP问题了,也可以把问题转化成正整数拆分。
容易设出 F[i][j] ,表示处理到第 i 个弹珠、第
j 个盒子的方案数。那么初始值就是: F[i][1] = F[i][i] = 1
(即:将 i 个弹珠放入
1 个或 i 个盒子里的方案数都是1 )显然转移方程式就是:
F[i][j] = F[i−1][j−1] + F[i−j][j]
-(即:第 j 个盒子放弹珠 和 每个盒子都加上一个弹珠)
- 那么这样的时间复杂度就是
O(N∗K) 。Code
#include<cstdio> using namespace std; const int N=5001,mo=998244353; int n,k; int f[N][N]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { f[i][i]=f[i][1]=1; for(int j=2;j<=i;j++) f[i][j]=(f[i-1][j-1]+f[i-j][j])%mo; } printf("%d",f[n][k]); return 0; }