题意:
。。。
思路:
首先考虑最直接的三维方程
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];
}
本文介绍了一种利用动态规划解决程序员编写代码时产生的Bug数量问题的方法。通过优化三维方程,将时间复杂度降低到O(n^3),并提供了一段具体的实现代码。
&spm=1001.2101.3001.5002&articleId=45578197&d=1&t=3&u=8a74ec3008e7481f85ea84862d59e386)
330

被折叠的 条评论
为什么被折叠?



