动态规划

1、前言

动态规划和分治算法非常类似,都是通过组合子问题的解来求解原问题。分治算法将问题划分为互不相交的子问题,而动态适应于子问题重叠的情况

动态规划常用于求解“最优化问题”,这类问题有很多个解,我们希望寻找最优解(最大值或最小值)

通常按如下四个步骤来设计一个动态规划算法:

  • 刻画一个最优解的结构特征
  • 递归地定义最优解的值
  • 计算最优解的值,通常采用自底向上方法
  • 利用计算出的信息构造一个最优解

或者说,动态规划有3个关键要素。

  • 1、最佳子问题(将复杂问题转化成简单问题)
  • 2、边界条件(一般是当数据量极少情况下的结果,比如n==0或n==1时的情况)
  • 3、状态转移方程(考虑 n-1 和 n这两种规模时,结果之间的推导)

2、钢条切割问题

给定一段长为n的钢条和一个价格表,求解收益最大的钢条切割方案

钢条价格

钢条价格如上,怎么切割才能有最大收益呢?通过钢条价格,我们能手动计算出钢条最佳切割方案。

最优切割方案

定义长为n的钢条切割最大收益为Rn,假设在k位置将钢条切成两段能获得最大收益,那么这两段k和n-k肯定也是最大收益,如果我们遍历循环,可得到如下公式:

最大收益

最大收益为,不切割以及从1到n-1位置切割的收益最大值。

换一个角度重新考虑,如果从1到n-1位置切割,但左边的钢条不再切割,右边的钢条使用最佳方案切割。这样得到的会不是也是最佳切割方案呢?

很明显,这种做法也是正常的,想象最终切割结果,肯定也是符合这种模式的。这样简单的递归更利于编码。

新公式

动态规划的精髓在于保存子问题的解,以提高效率。在编码中我们新定义Rn,保存n长度的最大收益,并采用自底向上方法,即先求R0,R1,再求其它,如果单纯使用暴力递归的话,效率非常低。

  public static int[] steel(int[] p){
    int[] s = new int[p.length];
    s[0] = 0;
    int max = 0;
    //因为长度为0的钢条,切割最大收益为0,S[0]已知,所以i从1开始
    for (int i = 1; i < p.length; i++) {
        max = 0;
        for (int j = 1; j <= i; j++) {
            //j也必须从1开始,如果从0开始,i等于1时,s[i-j]就等于s[1]了,而s[1]还是未知值
            if (max < (p[j] + s[i-j])) {
                max = p[j] + s[i-j];
            }
        }
        s[i] = max;
    }
    return s;
}

2、最大子数组和

给出一个数组,求最大子数组和。例如给出如下数组,最大子数组和为20

                  -2, 11, -4, 13, -5, -2

此问题解题思路和1不一样。

仔细考虑,如果设长度为n的最大子数组和为Sn,那么Sn和Sn-1有什么关系呢?动态规划最重要的思想就是将大问题分解为子问题,并由子问题求解。

直接考虑Sn和Sn-1,好像二者没有任何关系,如果我们换个角度考虑,长度为n的数组,且以n结尾的最大子数组和为Sn,这么定义的话,那么根据Sn的值,如果Sn大于0,那么Sn+1等于Sn加上a[n],如果小于0,那么Sn+1等于a[n]。

公式为:

dp[i+1] = max(dp[i]+a[i+1] , a[i+1])

  public static int getMaxSubArray(int[] array){
    int[] b = new int[array.length];
    int max = 0;
    b[0] = array[0];
    max = b[0];
    for (int i = 1; i < array.length; i++) {
        if (b[i-1] > 0) {
            b[i] = b[i-1] + array[i];
        }else {
            b[i] = array[i];
        }
        if (max < b[i]) {
            max = b[i];
        }
    }
    return max;
}

3、结语

动态规划还有其它经典问题,比如矩阵最少相乘次数,最长公共子序列,最优二叉搜索树等等。本文只讲了两个简单例子,简述动态规划的原理,可以更深入思考,二维的动态规划问题解决,以加深理解。

以上代码均已上传至本人的github,欢迎访问

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

推荐阅读更多精彩内容

  • 动态规划应用于子问题重叠的情况。对于公共子问题,分治算法会做很多不必要的工作,它会反复求解公共子问题。而动态规划算...
    LRC_cheng阅读 433评论 0 1
  • 《算法导论》这门课的老师是黄刘生和张曙,两位都是老人家了,代课很慢很没有激情,不过这一章非常有意思。更多见:iii...
    mmmwhy阅读 5,277评论 5 31
  • 状态转移方程 从之前某个阶段的某个或某些状态状态到下一个状态之间的关系式,就叫做状态转移方程。 最优子结构 每个阶...
    Myth52125阅读 288评论 0 0
  • 目录 动态规划与分治法 2.动态规划求解的最优化问题应该具备的两个要素2.1 最优子结构2.2 子问题重叠 动态规...
    王侦阅读 1,380评论 0 1
  • 第八十七章 回到J市的日子忽然就多了一点烟火气,徐艾每天都能接到来自刘辉并不打扰的问候,他不会固定在某一个时刻打给...
    chief风阅读 317评论 3 5