这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤:

动态规划求解的五个“简单”步骤:

  • 定义子问题;
  • 猜部分解决方法;
  • 关联子问题的解决方法;
  • 递归&记录 或者 构建自下向上的动态规划表;
  • 解决原问题。

拿上节课的例子(斐波那契数和最短路径)来看,如下图所示:

一、文本对齐

首先,我们先看下文本对齐问题,在使用word排版文字的时候,为了排版美观,我们常会用到文本两端对齐的功能。文本对齐功能就是将文本拆分成合适的行,让行内尽可能塞进足够的词。微软MS OFFICE是用贪心算法做的,而Latex是用动态规划算法去做,效率会更高些。在解决文本对齐问题时,我们要定义它的对齐代价,即如果拆分后的文本近似与行宽,则它们的badness近乎于0,但如果不合适,则无穷。如下图所示:

现在,我们用上面讲的五步求解步骤来分析下:

  1. 子问题:自第i个word后的文本后缀words[i:](子问题数量为n);
  2. 猜:从哪开始第2行(猜的选择小于等于n-i,即不超过后缀words[i:]的长度);
  3. 递归;
  4. 拓扑次序:从后往前去安排words;(补充:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。)
  5. 原问题:求起始位置的动态规划。

在上面的过程中会用到父指针,用于记住哪个猜的是最好的,这样下一个猜测可以直接基于上一个最好的猜测进行。

二、黑杰克

黑杰克是一个赌场游戏,如果看过《决胜21点》的话,电影里面的21点扑克玩法就是黑杰克。游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。在要牌的过程中,如果所有的牌加起来超过21点,玩家就输了——叫爆掉(Burst)。假如他没爆掉,那么你就与他比点数大小,大为赢。拿牌叫HIT,停牌(不再拿牌)叫STAND。玩家叫player,庄家叫dealer。

在黑杰克中的动态规划求解五步为上图所示,这里不做详细解释,因为游戏规则我也不是很懂,后续有空再了解进行补充。

[MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克的更多相关文章

  1. [MIT6.006] 19. Daynamic Programming I: Fibonacci, Shortest Path 动态规划I:斐波那契,最短路径

    这节课讲动态规划的内容,动态规划是一种通用且有效的算法设计思路,它的主要成分是"子问题"+"重用".它可以用于斐波那契和最短路径等问题的求解上. 一.斐波那契 ...

  2. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  3. [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题

    这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...

  4. Unique Binary Search Trees I&&II(II思路很棒)——动态规划(II没理解)

      Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For exa ...

  5. [LeetCode] Text Justification 文本左右对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  6. [Swift]LeetCode68. 文本左右对齐 | Text Justification

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...

  7. [leetcode]68. Text Justification文字对齐

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...

  8. 68. Text Justification一行单词 两端对齐

    [抄题]: Given an array of words and a width maxWidth, format the text such that each line has exactly  ...

  9. 68. Text Justification (JAVA)

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...

随机推荐

  1. dockerfile解析过程

    什么是dockerfile? DockerFile是用来构建docker镜像的文件,是由一系列命令和参数组成. 构建步骤? 1.编写dockerfile文件 2.docker build 3.dock ...

  2. nginx的变量系统

    本来想写一下nginx的脚本引擎的,但是看起来实在是有点庞大,一时间还不知道该从哪里写比较好.就先写一下他的变量系统吧,这是脚本引擎非常重要的组成部分. 首先为了表述清楚先规定几个术语吧 内置变量:n ...

  3. 多测师讲解selenium _ 获取input输入文本值_高级讲师肖sir

    1.get方法来获取到对应元素它的值 案例代码比如在输入框中输入666 driver.find_element_by_css_selector('#kw').send_keys('666')l =dr ...

  4. day15 Pyhton学习

    迭代器 掌握for循环 实际上for循环的本质,就是将一个可迭代的变成迭代器 每一次从中取值都相当于执行了一次next 如果是迭代器,那么只能取一次值 生成器 - 本质就是迭代器 生成器函数(返回值是 ...

  5. pytest文档44-allure.dynamic动态生成用例标题

    前言 pytest 结合 allure 描述用例的时候我们一般使用 @allure.title 和 @allure.description 描述测试用例的标题和详情. 在用例里面也可以动态更新标题和详 ...

  6. 身为电气人,为什么也要学习C语言编程?人生苦短,我学编程!

    说起编程大家可能都听过,但编程究竟是怎么一回事你弄懂了吗? 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机.办公的电脑.你点击的页面.浏览的网页,都是有程序让它执行你要它做的事情. PL ...

  7. win安装appium

    Windows 下配置 Appium,要提前装好jdk,请参考:https://jingyan.baidu.com/article/e8cdb32b2699cb37042bad59.html 1.下载 ...

  8. Redis Lua脚本完全入门

    1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.R ...

  9. spring-boot-route(二十)Spring Task实现简单定时任务

    Spring Task是Spring 3.0自带的定时任务,可以将它看作成一个轻量级的Quartz,功能虽然没有Quartz那样强大,但是使用起来非常简单,无需增加额外的依赖,可直接上手使用. 一 如 ...

  10. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...