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

题意:
。。。
思路:
首先考虑最直接的三维方程
dp(i, j, k) 表示前i个程序员写了j行代码bug不超过k
dp(i,j,k)=dp(i1,jr,kra[i]),ir
我们可以换种视角优化这个方程
1)第i个程序员没写代码
2)第i个程序员写了至少一行
dp(i,j,k)=dp(i1,j,k)+dp(i,j1,ka[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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值