小白学C++语言算法之暴力递归与动态规划

暴力递归

把问题转化为规模缩小了的子问题

有明确的不需要继续进行递归的条件(边界)

递归的code一点也不难,甚至很简单..

但是想出来怎么写怎么做真的好难...

汉诺塔问题

规则是:不能大压小,只能小压大

所以,把N层汉诺塔问题,变成这样

由此见得,其实高层的汉诺塔问题,都是无限累加的二层汉诺塔问题

都是

1-> another a

2-> another b

1-> another b

一、 从左到右的尝试模型

1 字符串

规定1和A对应,2和B对应...

那么一个字符串 111

可以变成 AAA AK KA

给定一个只有数字字符组成的字符串str,返回有多少种转化结果

2 背包

给定两个数组weight和values

weight[i]和values[i]分别代表 i号物品的重量和价值

给定一个正数bag,表示一个载重bag的袋子

求能装下最多的价值是多少

方法一

方法二

模型总结

这种从左到右的尝试,有点类似于初中数学中的追及问题

一个跑了... 后面还有多少... 总共占了多少...

index一直在往终点位置跑

然后已经跑过的路程先定义一个方法(比如已经占了多少价值,已经有了多少字符排列方式

再依次递归

(其实还是有点难理解 md

递归杀我

二、 范围上尝试的模型

纸牌问题

给定一个整型数组arr,代表数值不同的纸牌排成一条线

A和B依次拿走每张牌

规定A先拿,B后拿

但是每个玩家每次只能拿走最左或最右的纸牌

返回最后获胜者的分数

题目有点难以理解,直接举例子

这里所谓“先手”“后手”其实是被抽象化了的。

当轮到A拿的时候,A就是先手。当A拿完了,A又变成后手。

所以first函数那里有选择权:

拿arr[l]更大还是arr[r]更大

然后再累加后续A拿后手的

真的很抽象。。。举例说明吧

3,100,7这个数组

其中f、s都是A的过程,所以当A进入后手选择时,并不是A“主观”上的选择,是B留给A最小的那个值。

N皇后问题

一行只放一个皇后,一列也只能有一个..

感觉有点类似于矩阵中的行变换

只用一个一维数组就可以表示位置

因为一行只能有一个,比如 arr[0] = 7 说明0行的皇后位于7列

总结

我感觉目前看到这些递归例题有一个共同点:

都是

假设前面 多少多少 已经定好了

比如我现在在第一行,我假设前面没有定好的...

然后递归内部 再往后遍历...递归到第二行

第二行,假设第一行已经定好了

前面的背包问题也是类似如此

其实感觉某种意义上来说也是一种循环

明天开始就先不写这些东西了...

在学动态规划的过程中,突然对博弈论充满了兴趣

打算明天找一本博弈论相关的书籍读一下~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值