程序员算法基础——动态规划

前言

本文以一道BAT常见的算法面试题开篇,引入动态规划的基础概念, 介绍其思考过程。

正文

一、BAT最常见的一道算法面试题——上台阶

有一个楼梯总共n个台阶,只能往上走,每次只能上1个、2个台阶,总共有多少种走法。

解决方案:
1、排列组合;
枚举2的个数,再枚举2具体放的位置;
计算复杂,容易遗漏。

2、动态规划;
dp[n] 表示n个台阶的走法,那么有:
dp[n]=dp[n-1]+dp[n-2];
思路清晰,代码简单。

二、动态规划基础概念

1、动态规划;
动态规划(Dynamic Programming)指的是解最优化问题的一种方法。

2、最优子结构性质;
问题的最优解可以分解为若干子问题,且子问题的解也是最优的;
以上台阶为例,到第i层的最多走法,可以分解为第i-1层和第i-2层的走法之和,且第i-1层和第i-2层的走法也是最多的;

3、 无后效性;
现阶段的决策不会影响未来的决策;
以上台阶为例,走到第i-2层的最多走法,不会因为增加第i-1层而改变;

三、动态规划思考过程

动态规划的思考过程可以总结为:大事化小,小事化了。
大事化小:
一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题,也称为状态转移;
小事化了:
小问题的解决通常是通过初始化,直接计算结果得到;

具体的步骤

  • 1、将大问题分解为子问题
  • 2、确定状态表示
  • 3、确定状态转移
  • 4、考虑初始状态和边界情况

四、另一个经典的例子——数塔

有如图所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

题目链接点这里


解决思路:
1、大事化小。要到达第i层,先要到达第i-1层。并且第i层的第j个节点,只能由i-1层的第j个和第j-1个节点到达。
我们用dp[i][j]表示,走到第i层第j个位置的数字最大和。
那么有dp[i][j]=max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];

2、小事化了。第1层的第1个节点,初始值为dp[1][1]=a[1][1]。(a[x][y]表示第x层,第y个的值)

五、数塔例子的变形——收集苹果

平面上有N*M个格子,每个格子中放着一定数量的苹果。
你从左上角的格子开始,每一步只能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来。
这样下去,你最多能收集到多少个苹果。

解决思路:
1、只能向右走或者向下走,要到达第i行第j列的格子的时候,可以由第i-1行第j列或者第i行第j-1列到达,我们用dp[i][j]表示,走到第i行第j列的最多苹果数,那么有:
dp[i][j]=max(dp[i-1][j], dp[i][j-1]) + a[i][j];

2、第1行第1列,初始值为dp[1][1]=a[1][1],注意事项是边界条件的处理。

六、动态规划经典——01背包问题

给定n件物品和一个容量为m的背包,每件物品都会消耗背包的一定容积c[i],并带来一定价值v[i],要求如何选取装入背包中的物品,使得背包内的物品价值最大。

解决思路:
把n件物品放入背包,可以分解为“将前i件物品放入容量为m的背包中”问题。
若只考虑第i件物品的选择,那么问题可以分为两种情况:
1、如果不放第i件物品,问题就转化为“前i-1件物品放入容量为v的背包中”
2、如果放第i件物品,问题就转化为“前i-1件物品放入剩下的容量为m-c[i]的背包中”

我们用f[i][j]表示前i个物品,放入容量为j的背包的最大价值,上面的两种情况可以表示为
f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+v[i]);

初始化条件memset(dp, 0, sizeof(dp));dp[1][c[1]]=v[1]
最后遍历f[n][1~m]可以得到最大值。

总结

如果还不能完全理解01背包,那么还需要再仔细理解最优子结构状态表示状态转移
算法能扩展思考方向,完善思维能力。学会“上台阶”、“数塔”、“01背包”这三个题目,能解决算法面试的动态规划部分。

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

推荐阅读更多精彩内容