您的位置:首页 > 其它

codeforces 543A Writing Code(dp降维优化,完全背包思想)

2015-05-08 12:34 519 查看
题意:

。。。

思路:

首先考虑最直接的三维方程

dp(i, j, k) 表示前i个程序员写了j行代码bug不超过k

dp(i,j,k)=∑dp(i−1,j−r,k−r∗a[i]),第i个程序员写了r行代码dp(i, j, k) = \sum{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])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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: