动态归划爬楼梯C语言?

本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划。如果没有,那么出题的面试官真的没有水平。跌了N次的动态规划,Runsen最近也拼命搞动态规划。这篇文章浪费了三天时间。

 本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划。如果没有,那么出题的面试官真的没有水平。跌了N次的动态规划,Runsen最近也拼命搞动态规划。这篇文章浪费了三天时间。

极客时间超哥的动态规划、拉勾教育的算法专栏。Runsen真的不想在动态规划,死一次又一次。死了N次,学了N次,就是他妈的写不出来。

动态规划需要搞定三个系列:三个背包,零钱问题和股票问题。今天,Runsen就开始干掉最重要的「背包问题」。

三个背包问题:01背包,多重背包,完全背包。

「最优子结构:一般由最优子结构,推导出一个状态转移方程 f(n),就能很快写出问题的递归实现方法。把大问题变成几个小问题,在几个小问题中求出最佳解。」

「重叠子问题:比如斐波那契数列中的f(5),算了f(4)和f(3),结果f(4)又给Runsen算了一次f(3)。其实就是将一棵二叉树进行剪枝操作,方法是备忘录来存储在内存上。」

「自下而上:反过来求解」

动态规划是一种求问题最优解的方法。通用的思路:将问题的解转化成==> 求解子问题,==> 递推,==>最小子问题为可直接获得的初始状态。

判断是否可用递归来解,可以的话进入步骤 2

分析在递归的过程中是否存在大量的重复子问题

采用备忘录的方式来存子问题的解以避免大量的重复计算(剪枝)

改用自底向上的方式来递推,即动态规划

关键就是「找状态转移方程」。

斐波那契数列和爬楼梯问题

斐波那契数列最早从兔子问题演变过来的,

假设一对初生兔子一个月到成熟期,一对成熟兔子每月生一对兔子,并且一年内没有发生死亡。那么,由一对初生兔子开始 一年以后可以繁殖多少对兔子?

发现以上规律是,每月的兔子对数=上一月的兔子对数+该月新生的兔子对数=上一月的兔子对数+上上月的兔子对数

这个序列即为斐波那契数列“(Fibonacci sequence)”。斐波那契数列中的任一个数,都叫斐波那契数

斐波那契数列,通常都是用来讲解递归函数,尝试用递归的思路来解决,但是时间复杂度高达。

这个 fib(1) 就是完全重复的计算,不应该为它再递归调用一次,而是应该在第一次求解除它了以后,就把他“记忆”下来。

这就是备忘录解法,用空间来换取时间的思路。把已经求得的解放在字典Map或者列表list 里,下次直接取,而不去重复结算。

备忘录解法的代码和动态规划的代码和思路基本一致。

斐波那契数列在Leetcode也有一题类似的,这是Leetcode第70题. 爬楼梯,每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

  1. 解释: 有两种方法可以爬到楼顶。 
  2. 01背包问题就是物品只有一件。

    1. 输入格式 : 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。  

    在解决这类问题先,dp怎么定义和状态转移方程怎么搞就是重要,搞定了就是半分钟的事情。搞不定了可能半小时的事情。

    很多人和Runsen一样,都会把状态定义二维数组:为前i「个」 物品中,体积恰好为v 时的最大价值。

    状态转移方程也是顺便搞定:

身份认证 购VIP最低享

领优惠券(最高得80元)

题目:买书 有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下: 如果单独购买其中一卷,那么可以打9.5折。 如果同时购买两卷不同的,那么可以打9折。 如果同时购买三卷不同的,那么可以打8.5折。 如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱呢?(x、y、z为三个已知整数)。

我要回帖

更多关于 动态规划 c++ 的文章

 

随机推荐