关于动态规划算法的一道acm习题

本文通过一道杭电OJ1028题,详细介绍了动态规划算法的理解过程。作者从递归的角度出发,分析了动态规划与递归的区别,并通过实例解释了动态规划的思路,包括如何设置初始状态、理解dp数组的意义以及找到递归关系。
摘要由CSDN通过智能技术生成

作为一名小白,完全不知道动态规划究竟是什么意思,百度了下词条我语文不好看不懂它在说什么,那不如联系下实际,看看动态规划算法究竟怎么用。来自杭电oj1028题
在这里插入图片描述
在这里插入图片描述
昨天按照自己的理解,将网上抄的代码按照递归来理解,今早女神发信息说这是动态规划,递归是函数自己调用自己,一看果然不是递归,大体思路没啥太大问题,那也重新理解下:
以下是我昨天对于这道题的理解:

拿到这道题,我们不妨转变思路,把此题转变成n个苹果装入n个盘子的过程,我们需要两个变量i,j分别代表苹果数和盘子数,由于ij需要进行循环,且苹果作为大循环,盘子作为小循环,大循环嵌套小循环,所以我们定义一个二维数组来形象的存储苹果和盘子,最后将本身的值作为我们想要的结果——有几种摆放方法。接下来我们要考虑苹果和盘子的数量关系:

  1. 盘子数大于苹果数:很简单将问题转化成将苹果放入和苹果数量等同的盘子中即可。
  2. 盘子数等于苹果数:根据题中示例,可明了的将问题转化为将苹果放入盘子数-1的盘子中的所有情况加一
  3. 盘子数小于苹果数:又得分两种情况第一种情况是填完苹果之后还有空余盘子,第二种情况就是盘子都填满了;第一种情况的话,如果填完之后还有空余盘子,那就可以把那个空的盘子(至少有一个)拿走,所以减一最后总的情况数还是不变的,第二种情况的话,如果都填满了,那么我们把每一个盘子都拿走一个苹果之后,他的这种情况应该和没拿之前那种情况是一样的,其实我有这地方有点儿想不太懂,我拿笔写了一下,一下子懂了,所以年轻人遇到问题一定要多动笔。
    上面第二条分析很不清楚,今早看了女神给我发的信息,正确的理解应该是当苹果数i=盘子数j 时,
    分两种情况讨论:
    1、至少有一个盘子不放苹果,摆放方式就是把i 个苹果放在j-1个盘子里(摆放方式总数与第一个空盘子无关),摆放方式总数表示为dp[i][j-1]
    2、每个盘子都放苹果,因为苹果数=盘子数,所以刚好每个盘子一个苹果,只有一种摆放方式
    故当盘子数等于苹果数的代码为:dp[i][j]=1+dp[i][j-1];

再系统说下本题,及需要注意的点:

dp[a][b]

表示把a 个苹果放入b 个盘子的摆放方式总数,允许有的盘子不放苹果,画一个类似棋盘的表格,例如第一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值