动态规划

一、什么是动态规划

  不懂动态规划的程序猿,不是好攻城狮。
  在面试算法题时,当你看到以下四个特点时,脑海中就应该想到【动态规划】这四个词了。
【1】求一个问题的最优解(最大值或者最小值);
【2】该问题可以分解成类似的若干个子问题,即整个问题的最优解是依赖于各个子问题的最优解;
【3】分解后的子问题还有相互重叠的更小的子问题,换句话说在算法计算中我们会重复计算某些个子问题的值,因此,为了提高效率,我们需要合理利用(保存)已经计算过的值,不能做重复的操作;
【4】分析问题时,从整体到局部亦或说从上至下分析,解题时从下往上求解问题,这样可以利用已经计算过的值去解决更大一点问题的值。

二、应用实例

题目大意:

  给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.

代码实现(java):

/**
 * @author lm
 * @create 2018-03-27 14:39
 * @desc dd
 **/
public class CuttingRope {

    public int maxAfterCutting(int length) {

        if (length < 2) return 0;
        if (length == 2) return  1;
        if (length == 3) return  2;

        /*
        声明整形数组,用于保存中间结果;
        子问题的最优解存储在数组中,数组中的第i个元素表示把长度为i的绳子剪成若干段后各段长度乘积的最大值。
         */
        int resultArr[] = new int[length + 1];
        resultArr[0] = 0;
        resultArr[1] = 1;
        resultArr[2] = 2;
        resultArr[3] = 3;

        int max = 0;
        //求每个i的最大值
        for (int i = 4; i <= length; i++) {
            max = 0;
            for (int j = 1; j <= i/2; j++) {
                int tempResult = resultArr[j] * resultArr[i - j];
                if (tempResult > max) {
                    max = tempResult;
                }
                resultArr[i] = max;
            }
        }
        max = resultArr[length];
        return max;
    }

}
//测试用例
public class CuttingRopeTest {
    CuttingRope cuttingRope = new CuttingRope();
    @Test
    public void maxAfterCutting() throws Exception {
        assertEquals(4, cuttingRope.maxAfterCutting(4));
        assertEquals(18, cuttingRope.maxAfterCutting(8));
        assertEquals(2, cuttingRope.maxAfterCutting(3));
    }

}

总结

  本题是一道典型的动态规划算法题,为了避免递归产生的重复计算,采用了从下而上的计算顺序实现。

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

推荐阅读更多精彩内容

  • 我以前很喜欢文学作品。 每次朋友让推荐书,我随口就能说出一大堆世界文学名著,还能把故事梗概、中心思想说得头头是道。...
    宇枫Sai阅读 410评论 2 1
  • 病房里。 昏迷的罗森躺在床上,张正发现了他脖子上那两个触目惊心的深深牙痕,不由深锁眉头,心里一阵阵担忧。 同时他也...
    樹里阅读 153评论 0 0
  • 课前聊天: 请小朋友们说一说,爸爸妈妈都带你们去过哪些场所。大家一一举手回答:游乐场、电影院、超市、学校、商场、健...
    光之工作者sunny阅读 467评论 4 1
  • 今天听了熊太行的直播,感触很大,很多的关系其实需要刻意为之。 最大的感悟就是,成功有方法,关系有套路,而所谓的套路...
    陆小远阅读 125评论 0 0
  • 我放弃认为自己没有价值的信条。我值得拥有最好的生活,现在我允许自己接受它,我愿意丢弃旧的信念来创造新的环境。
    诚love阅读 239评论 0 0