递归和动态规划大总结

斐波那契系列问题的递归和动态规划

题目一:返回斐波那契数列的第N项

斐波那契数列的形式可以表示为:1,1,2,3,5,8......,也就是除了第一项和第二项为1外,第N项F(N)=F(N-1)+F(N-2),可以写出暴力递归代码,时间复杂度为O(2^N)
斐波那契数列
题目二:给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回多少种走法

如果台阶只有一级,只有一种走法;如果台阶有两级,走法有两种;如果台阶有N级,最后跳上第N级的情况,要么是从N-2级直接跳两级台阶,或者从第N-1级跳一级台阶,所以台阶有N级的方法数等于跨到N-2级台阶的方法数加上跨到N-1级台阶的方法数,即S(N)=S(N-1)+S(N-2),初始项为S(1)=1,S(2)=2,类似于斐波那契数列,只不过是初始项不同。
跳台阶问题
题目三:假设农场中成熟的母牛每年只会生1头小母牛,并且永远都不会死。第一年农场有一只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛三年以后成熟又可以生小母牛。给定整数N,求N年后母牛的数量

所有的牛都不会死,所以第N-1年的牛会活到第N年;那么成熟的牛的数量该如何估计呢,就是N-3年的牛的数量,期间出生的牛都不会成熟,所以C(N)=C(N-1)+C(N-3),初始项为C(1)=1,C(2)=2,C(3)=3,又是类似于斐波那契数列,代码如下:
母牛问题

矩阵的最小路径和

题目:给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后达到右下角的位置,路径上所有数字累加起来就是路径和,返回所有路径中最小的路径和

假设现在有如下矩阵:
矩阵

那么1,3,1,0,6,1,0就是最短路径。

这是一道经典的动态规划问题。假设矩阵m的大小为MxN,行数为M,列数为N。先生成大小和m一样的矩阵dp,dp[i][j]的值表示从左上角走到[i][j]位置的最小路径和。对于m的第一行的所有位置来说,从(0,0)位置到(0,j)位置只能往右走,所以(0,0)位置到(0,j)位置的路径和就是m[0][0...j]这些值的累加结果。同理,对于m的第一列的所有位置来说,从(0,0)位置走到(i,0)位置只能往下走。

除第一行和第一列的其他位置外,都有左边位置(i-1,j)和上边位置(i,j-1),所以dp[i,j]=min{dp[i-1,j],dp[i,j-1]}+m[i,j];以上面的例子来说,最终生成的dp矩阵如下:
dp矩阵

除第一行和第一列外,每一个位置都要考虑从左边到达自己的路径和最小还是从上边到达自己的路径和最小。最右下角的值就是整个问题的解。动态规划代码如下所示:
矩阵最小路径和

在这个算法中,时间复杂度为O(MxN),额外的空间复杂度为O(MxN)。

换钱最少的货币数

给定数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正数aim代表要找的钱数,求组成aim的最少货币数

该问题的经典动态规划方法。如果arr的长度为N,生成行数为N,列数为aim+1的动态规划表dp。dp[i][j]的含义是在可以任意使用arr[0...i]货币的情况下,组成j所需的最小张数。根据这个定义,dp[i][j]的值的计算方法如下:

  1. 当列数为0即在第一列上,表示找到钱数为0时需要的最小张数,易得结果为0
  2. 当行数为0即在第一行上,表示在只能使用arr[0]货币的情况下,找某个钱的最小张数。比如,arr[0]=2,那么能找开的钱数为2,4,6,8......所以令dp[0][2]=1,dp[0][4]=2,dp[0][6]=3,第一行其他位置代表的钱数一律找不开,所以一律设为32位整数的最大值,我们设这个值为max。
  3. 剩下的位置依次从左到右,再从上到下计算。假设计算到位置(i,j),那么dp[i,j]的值可以简化为来自下面的情况:
  • 第一种情况就是使用arri货币,那么结果就变成了求dp[i][j-arr[i]]+1
  • 第二种情况就是不使用arr[i]货币,那么结果就变成了求dp[i-1][j]
  • 最后选择上述情况中较小的值最为最终dp[i][j]的解,所以dp[i][j]=min{dp[i-1][j],dp[i][j-arr[i]]+1}
    如果j-arr[i]<0,即发生越界了,说明arr[i]太大,用一张都会超过钱数j,令dp[i][j]=dp[i-1][j]即可,具体代码如下,时间复杂度和额外空间复杂度都为O(Nxaim):


    换钱最少的货币数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容