zoukankan      html  css  js  c++  java
  • DP问题如何确定状态

    DP问题如何确定状态

     一、dp实质

    动态规划的实质就是通过小规模的同类型的问题来解决题目的问题。

    所以有一个dp数组来储存所有小规模问题的解。

    所以确定状态也就是缩小问题规模。

    我们求解问题的一般规律就是:实例化,缩小化。

    二、dp确定状态方法

    1、明确题目中的问题

    2、找出限制因子

    3、缩小规模

    4、根据前三个写出状态

    三、实例

     1、合并石子

    题目大意:n堆石子,每次合并相邻的两堆,每次合并两堆的和作为代价,求将n堆石子合并成一堆的最小代价。

    求解状态:

    因为每次合并石子都是两堆,虽然它们是相邻的,合并的话可以向左也可以向右,所以用一维还是无法确定怎么合并。显然这里我们需要两维。

    所以这里我们可以用i,j两个变量分别表示两个要合并的石子堆。

    1)、明确题目中的问题

    因为显然状态两维,我们用两维来描述题中问题:求将第1堆石子到第n堆石子合并成一堆的最小代价。

    2)、找出限制因子

    显然这个1和n就是限制因子

    3)、缩小规模

    现在将问题缩小规模(也就是将限制因子缩小规模):求将第i堆石子到第j堆石子合并成一堆的最小代价。(1<=i<=j<=n)

    4)、综合

    所以得到状态就是:f[i][j]表示第i堆石子到第j堆石子合并成一堆的最小代价。(1<=i<=j<=n)

    5)、其它

    如果这个状态不好确定初始和最终状态,或者这个状态很难写状态转移方程,那就需要换状态,换状态的一般方式就是增加维度。

    2、乘积最大

    题目大意:在一个长度为n的数字串s中插入k个乘号,使得乘积最大

    举例:数字串123,k=1,可得最大乘积为12*3=36

    求解状态:

    1)、找出限制因子

    显然n和k就是限制因子

    2)、缩小规模

    在一个长度为i的数字串中插入j个乘号,使得乘积最大(i<=n,j<=k)

    3)、综合

    所以状态就是:f[i][j]表示在一个长度为i的数字串中插入j个乘号的最优解

    因为数字串有序,所以状态转移方程变成下面的:

    f[i][j]表示在数字串s的前i个数字中插入j个乘号的最优解

    今天太晚,明天继续

  • 相关阅读:
    iOS开发HTTP协议相关知识总结
    php的变量作用域
    ArcGIS Server 10.1发布要素服务(FeatureLayer server)时遇到的数据库注册问题
    ArcGIS for JavaScript 关于路径开发的一些记录(三)
    ArcGIS for JavaScript 关于路径开发的一些记录(二)
    学习小结(2014.62014.8)
    ArcGIS for JavaScript 关于路径开发的一些记录(一)
    【转载】javascript深入理解js闭包
    【小记录】关于dojo中的on事件
    虚拟多继承
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7277640.html
Copyright © 2011-2022 走看看