题意:
。。。
思路:
首先考虑最直接的三维方程
dp(i, j, k) 表示前i个程序员写了j行代码bug不超过k
dp(i,j,k)=∑dp(i−1,j−r,k−r∗a[i]),第i个程序员写了r行代码
我们可以换种视角优化这个方程
1)第i个程序员没写代码
2)第i个程序员写了至少一行
dp(i,j,k)=dp(i−1,j,k)+dp(i,j−1,k−a[i])
这个方程在时间复杂度上已经是O(n^3)了
如果我们在储存的时候省掉第一维
那么在枚举到 (i, j, k)这个状态的时候实际储存的是 (i-1, j, k)
那么
dp(j, k) = dp(j, k) + dp(j-1, k-a[i])
PS:
也可以让k表示严格有k个bug,只是初始化的时候就只让dp[0][0]=1
int solve() {
memset(dp, 0, sizeof(dp));
rep(i, 0, b) dp[0][i] = 1;
for (int k=1;k<=n;++k) {
for (int i=1;i<=m;++i)
for (int j=ai[k];j<=b;++j) {
dp[i][j] = (dp[i-1][j-ai[k]] + dp[i][j]) % mod;
}
}
return dp[m][b];
}