码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划-DP

时间:2018-12-13 16:33:54      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:数组   lin   表达式   方法   决策   个数   初始化   idea   rod   

Dynamaic Programming

定义&内容:

动态规划是运筹学中用于求解决策过程中的最优化数学方法。作为算法设计技术,是一种使用多阶段决策过程最优的通用方法。是解决最优化问题的重要工具。

多阶段决策过程:

  • 百科:多阶段决策是指决策者在整个决策过程中做出时间上先后有别的多项决策。它通常比只需做出一项决策的单阶段决策要复杂,它或是要决策者一次确定各阶段应选择的一串最优策略,或是找出表示一个过程内连续变化的一条控制变量曲线,或是确定适合不同状态的灵活策略
  • 总结:一次决策可以得到解的一部分,当做完所有决策就得到相应完整的解

什么样的问题适用DP

1)问题是由交叠的子问题所构成,大问题分解为小问题。

2)将交叠子问题的一次次求解\(\rightarrow\)子问题只求解一次,并将结果记录保存。

3)利用空间(子问题存储)来换取时间

keyword & main idea

  • 求解最优化问题
  • 是多阶段决策问题
  • 交叠子问题(存在重复的子问题)
  • 子问题存储,不求重复解
  • 自底向上的方法

求解步骤

多阶段决策问题
初始状态\(\rightarrow\)决策1\(\rightarrow\) 决策2 \(\rightarrow\)........\(\rightarrow\)决策n\(\rightarrow\)结束状态

动态规划三要素:

  • 问题阶段
  • 每个阶段的状态
  • 一个阶段如何进入下一个阶段的递推关系式

Tips :
可以列一个二维的表格,通过表格中元素进行规划。

问题求解

先从最简单的剪绳子(integer break product maximun)问题

int maxProductLength(int length){
    // 先进行判断
    if(length<2) return 0;
    if(length==2) return 1;
    if(length==3) return 2;

    // 定义一个数组,存储各个值
    // 交叠的子问题 的初始化
    int* product=new int[length+1];
    product[0]=0;
    product[1]=1;
    product[2]=2;
    product[3]=3;
    // 定义一个储存最大值的变量
    int max=0;
    for(int i=4;i<length;++i){
        max=0;
        for(int j=1;j<=i/2;++j){
            // 递推的表达式
            int product=product[i]*product[i-j];
            if(product>max)
                max=product;
        }
        product[i]=max;
    }
    max=product[length];
    delete[] product;
    return max;
}

动态规划-DP

标签:数组   lin   表达式   方法   决策   个数   初始化   idea   rod   

原文地址:https://www.cnblogs.com/GeekDanny/p/10114076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!