求解分饼干问题(DP)

博客内容介绍了如何使用动态规划解决一个与大数据相关的算法问题——分饼干。通过定义状态f[i][j]表示前i位数字对k取余后的j种方案数,博主详细阐述了状态转移方程,并指出如何从f[1][1]推导到f[2][k]。最终,通过状态转移顺利解决题目。
摘要由CSDN通过智能技术生成

题意:

 思路:根据数据范围可知,长度最多有18位,每位有9种可能。所以用dfs时间复杂度是9^18次方。这样肯定是会tle的,所以这里思考dp如何解决,那么dp就是如何描述一类状态,然后将答案归到某一类中,定义f[i][j]为前i位,%k为j的方案数量。那么初始状态就是f[0][0] = 1。对于1XX,n = 3,那么f[1][1] = 1是显然的,f[1][k]都为0。那么如何从f[1][1]推到f[2][k]的状态。我们知道对于abc来说,abc%n = (ab * 10 + c) % n = (ab * 10 % n + c % n) % n ,也就是当前的余数 = 前i - 1位的余数 + c的余数再对n取余。那么f[1][1]就可以推到至f[2][(1 + k % n) % n](0 < k < 10),那么这也是我们的状态转移方程,那么问题就顺利的解决了。

状态转移方程为:

当第i位为X时:f[i][newp] += f[i - 1][j] (newp = (j + k % n) % n)

当第i位不为X时:f[i][newp] += f[i - 1][j] (newp = (j + (str[i - 1]  - '0') % n) % n)

具体细节见代码:

#include <iostream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一万次悲伤_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值