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
。。。
思路:
首先考虑最直接的三维方程
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]; }
相关文章推荐
- codeforces 543A A. Writing Code(完全背包优化dp )
- DP(完全背包二进制优化) Problem T:Dividing(HDU 1059)
- CodeForces - 808E-K - Selling Souvenirs-DP(像背包但不是背包)+优化技巧
- hdu 5185 dp(完全背包)+优化
- [Codeforces 543A] Writing Code (完全背包DP)
- CodeForces 632E Thief in a Shop(DP|完全背包)
- CodeForces 543A - Writing Code DP 完全背包
- POJ3260_The Fewest Coins_deque优化dp解多重背包和完全背包
- CODEFORCES 189A(完全背包完全装满)
- Codeforces 629D Babaei and Birthday Cake(线段树优化dp)
- 完全背包 (DP)
- hdu 1059 多重背包 二进制优化 (完全 , 01)背包结婚
- hdoj 2546 饭卡【0-1背包】【dp思想】
- poj 2229 (dp 完全背包相似问题)
- codeforces 283C Coin Troubles(背包DP)
- nyoj311 完全背包 【dp】
- Problem 31 Coin sums(完全背包dp)
- 完全背包dp初始化问题
- HDU2159 【DP入门之完全背包】 经典题;
- codeforces 577B B. Modulo Sum(背包+dp)