动态规划-DP

Posted geekdanny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-DP相关的知识,希望对你有一定的参考价值。

Dynamaic Programming

定义&内容:

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

多阶段决策过程:

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

什么样的问题适用DP

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

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

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

keyword & main idea

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

求解步骤

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

动态规划三要素:

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

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的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1021 石子归并 (动态规划 简单代码)

动态规划算法(Dynamic Programming,简称 DP)

动态规划_计数类dp_数位统计dp_状态压缩dp_树形dp_记忆化搜索

动态规划-数位dp

[程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)

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