左程云-递归和动态规划
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左程云-递归和动态规划相关的知识,希望对你有一定的参考价值。
参考技术A 按照1,1,2,3,5.。。的顺序,依次求解即可。主要用到了矩阵的思想,看下面的递推公式:
使用动态规划的方法,建立dp数组,dp[i][j]代表从(0,0)位置到该处的最短路径。当然,我们可以使用空间压缩的方法,只用一维数组,保存每一行的结果,这样有效的降低的空间复杂度。
在每种货币数量无限的情况下,使用动态规划的方法,从二维数组的角度出发,dp[i][j]代表使用arr[0,1..i]货币的情况下,组成j所需的最小张数。后面使用空间压缩的方法,可以将二维数组变为一维数组。
值得注意的地方是,我们首先给一维数组全部赋值了max,而不是使用默认值0,max表示无法组成目标货币,0表示的是最少用0张就可以组成目标货币,这显然是不合理的。
思路跟上面的题目是一样的,不过需要注意的一点是,由于每张货币只能使用一次,因此我们在内部遍历每一行时,需要从后往前遍历。因为如果从前往后遍历,会出现硬币被多次使用的情况。
这里要注意的一点是,组成0元的方法是1种,而不是0种。
子串和子序列是不一样的, 子串必须是连续的,而子序列可以是不连续的。按照经典的动态规划方法,我们得到如下思路:
但题目中要求的空间复杂度是O(1),因此我们按照如下的思路,得到了正确的解决方法:
这里为什么会增加一列和一行,因为字符串是可以删除为空串,然后再通过插入操作来进行变换的,如果没有空串,会得到错误的答案。
与前面的题目不同的地方是,我们这里采用从右下角往左上角遍历的顺序。但是动态规划的思想都是一样的。
首先判断express是否合理:
随后使用动态规划的方法:
著名的N皇后问题,我们给出一种基于递归的方法。这里我们用了一个小trick,即用一个一维数组保存每一行皇后的问题,这样,我们就可以只判断列活着斜线上是否已经放置了皇后即可。
算法六 暴力破解递归到动态规划
本篇文章根据左程云视频教程整理而来
https://www.bilibili.com/video/BV11v411G7xR?p=7
人要过河,河里有鳄鱼,鳄鱼会吃人,如果鳄鱼吃了人,鳄鱼就会变弱,其他的鳄鱼就会来吃这个变弱的鳄鱼!问河里有多少条鳄鱼人可以平安过河
偶数条鳄鱼可以安全过河,奇数条鳄鱼会被吃掉
河里一条鱼,人会被吃掉
河里两条鱼,如果其中一条鱼吃掉人的话,另一条鱼就 会吃掉吃人的这条鱼,所以两条鱼谁也不敢去吃这条鱼!
……
100个硬币,A、B、C、D、E五个人来分,按照A、B、C、D、E的顺序来提出分配方案,超过半数的人赞成,方案才能被采纳,可以分走硬币。如果方案不被采纳,那么提出方案的人会被打死!问如何分硬币,A、B、C、D、E五个人才能都活着!
1)若ABCD都死掉了,只剩E,E:100
2)若ABC死掉了,剩DE,无论D投赞成还是反对,都会被杀掉,D:0,E:100
3)若AB死掉了,剩CDE,如果C死掉了,则只剩DE,则D必死,D为了不死,所以D只能投赞成票,C: 100,D:0,E:0
4)若A死掉了,剩BCDE,如果B想赢,所以B就得拉拢D、E,B:98,C: 0,D:1,E:1
5)ABCDE,若A想赢,所以A需要拉拢C、DE中的任何一个人,A:97,B:0,C: 1,D:2,E:0
一个村里的人相互寄信,一个人只能寄一封信,只能收一封信,不能寄给自己!假设村里有i个人,问有多少种寄信方式?
假设i=5,
假设B->E
1)若E->B,就转化为ACD三个人的寄信方式了
2)若E不寄信给B,此时,B可以收一封信,E可以寄出一封信,所以可以把BE看成一个人,就转化为了ABCD四个人的寄信方式了
B可以寄给ACDE四个人中的一个
所以F(5) = 4 * (F(3) + F(4))
寄信方式的函数
N皇后问题
不共列,不共斜线
优化:位运算判断是否共列、共斜线
没太看懂,pos 、 ( leftDiaLim | mostRightOne ) << 1、( rightDiaLim | mostRightOne ) >>> 1没太弄明白
斐波那契数列
会重复计算两遍
以上是关于左程云-递归和动态规划的主要内容,如果未能解决你的问题,请参考以下文章