dp总结

原创 2016年05月31日 20:44:12

      首先动态规划是解决多阶段决策问题的一种方法。。


     动态规划本质上就是一种排除重复计算的算法,更具体的说,动态规划就是用空间换取时间。

   

   多阶段决策问题:如果一类问题的求解过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策,并影响到下一个阶段的决策。多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果.


    而最优性原理即不论初始状态和第一步决策是什么,余下的决策相对于前一次决策所产生的新状态,构成一个最优决策序列。最优决策序列的子序列,一定是局部最优决策子序列。包含有非局部最优的决策子序列,一定不是最优决策序列。。


    使用动态规划普遍比其他方法代码短,所以说如果一道题可以用dp解和遍历解,这时候一定要选dp。。


     那么如何判断选不选用dp呢?

      1:问题具有多阶段决策的特征。
      2:每一阶段都有相应的“状态”与之对应,描述状态的量称为“状态变量”。
      3:每一阶段都面临一个决策,选择不同的决策将会导致下一阶段不同的状态。
      4:每一阶段的最优解问题可以递归地归结为下一阶段各个可能状态的最优解问题,各子问题与原问题具有完全相同的结构

   

     而dp的一般解题思路分为下面几个步骤:

      1、判断问题是否具有最优子结构性质,若不具备则不能用动态规划。
      2、把问题分成若干个子问题(分阶段)。
      3、建立状态转移方程(递推公式)。
      4、找出边界条件。
      5、将已知边界值带入方程。
      6、递推求解。


    举几个经典例子。。

   最经典的莫过于最优子序列了,好多问题都是他的变形。。。


输入数据
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N 个整数,这些整数的取值范围都在0 到10000。
输出要求
最长上升子序列的长度。
输入样例
7
1 7 3 5 9 4 8
输出样例
4


如何把这个问题分解成子问题呢?经过分析,发现 “求以ak(k=1, 2, 3…N)为终点的最长上升子序列的长度”是个好的子问题。
 由上所述的子问题只和一个变量相关,就是数字的位置。因此序列中数的位置k 就是“状态”,而状态 k 对应的“值”,就是以ak 做为“终点”的最长上升子序列的长度。这个问题的状态一共有N 个。状态定义出来后,转移方程就不难想了。 

假定MaxLen (k)表示以ak 做为“终点”的最长上升子序列的长度,那么:
MaxLen (1) = 1
MaxLen (k) = Max { MaxLen (i):1<i < k 且 ai < ak 且 k≠1 } + 1
实际实现的时候,可以不必编写递归函数,因为从 MaxLen(1)就能推算出MaxLen(2),有了MaxLen(1)和MaxLen(2)就能推算出MaxLen(3)……

代码:

int b[MAX_N + 10];
int aMaxLen[MAX_N + 10];
int main()
{
    int i, j, N;
    scanf("%d", & N);
    for( i = 1;i <= N;i ++ )
        scanf("%d", & b[i]);
    aMaxLen[1] = 1;

 for( i = 2; i <= N; i ++ ) 
    { //求以第i 个数为终点的最长上升子序列的长度
        int nTmp = 0; //记录第i 个数左边子序列最大长度
        for( j = 1; j < i; j ++ ) 
        { //搜索以第i 个数左边数为终点的最长上升子序列长度
            if( b[i] > b[j] ) 
            {
                if( nTmp < aMaxLen[j] )
                    nTmp = aMaxLen[j];
            }
        }
        aMaxLen[i] = nTmp + 1;
    }

int nMax = -1;
    for( i = 1;i <= N;i ++ )
        if( nMax < aMaxLen[i])
            nMax = aMaxLen[i];
    printf("%d\n", nMax);
    return 0;
}


————————————————————————————————————————————————————————————————


然后还有的经典题就是斐波那契数列问题或是这类的变形。。。。f(n)=f(n-1)+f(n-2)。。

这种题我的博客里也有好多。。

不举例子了。。



————————————————————————————————————————————————————————————————


       7
      3 8
    8 1 0
   2 7 4 4 
  4 5 2 6 5

第三类经典的就是数塔类了。。。这种题的解题思路就是往上递推,不断的用max函数就可求出来了。。


————————————————————————————————————————————————————————————————

1  2  3  4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

然后还有一类我把它定位格子类,大概的就是从某一个点到另一个点求最大数。。


————————————————————————————————————————————————————————————————


先这些,以后想起来再补充。。

树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016年08月27日 14:12
  • 1340

树形DP总结,持续更新

树形DP总结,持续更新
  • Dacc123
  • Dacc123
  • 2016年01月03日 18:09
  • 363

大神的总结与心得(先转再看

动态规划 单调队列   一般情况下,${dp}$方程可以搞成这样:${f_i=f_j+t_j+t_i}$,只要其中没有变量同时与${i,j}$都有关,那么我们可以用单调队列来做,单调队列里面元...
  • hpp__hpp
  • hpp__hpp
  • 2017年07月21日 20:44
  • 200

概率DP入门小结

说是概率DP,其实主要是求概率和期望的问题 说到DP总要有状态,每种状态可能有多种子状态 一般的DP是这样:在DP过程中,当前状态必然是由多个子状态中的最优的转移而来 所以一般的DP求的是最优的...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年08月27日 20:41
  • 531

数位dp总结 之 从入门到模板

for(int i=le;i
  • wust_zzwh
  • wust_zzwh
  • 2016年08月03日 14:37
  • 16260

非常好的动态规划总结,DP总结

总结的非常好,谢谢作者。 http://cppblog.com/menjitianya/archive/2015/10/23/212084.html 目录   一、动态规...
  • mmc2015
  • mmc2015
  • 2017年06月22日 09:31
  • 2680

我的总结-动态规划(DP)

说到动态规划,最开始接触到这类型的题目是在教练上课的时候放了杭电OJ的名为“数塔”的题目,其实仅靠着没有任何算法基础而且对电脑编程处理问题的方式还不熟悉只会暴力加模拟的思维方式,着实没有除开暴力之外的...
  • mo1302267724
  • mo1302267724
  • 2015年04月06日 20:50
  • 1114

DP问题各种模型的状态转移方程

转自:http://www.cnblogs.com/10jschen/archive/2012/08/19/2646087.html 1(最长公共子串(注意和最长公共子序列区别)) 两个字...
  • qq_30076791
  • qq_30076791
  • 2015年11月12日 22:44
  • 508

【DP算法篇之初学】LIS\LCS\二维DP\带条件DP

最近参加2016华为软件精英挑战赛,题目也比较直接,就是求过定点的最短路。这题和以前练得不一样,感觉是不是要用DP(动态规划)。可是对于DP,算法,我还是啥都不懂,于是好好补补。 先是参考这篇博文...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年03月14日 20:57
  • 2162

android dp深度解析

我转载地方的连接:http://zhangkun716717-126-com.iteye.com/blog/1772696  当笔记记录一下  dip: device independent pix...
  • hunanqi
  • hunanqi
  • 2016年07月11日 17:27
  • 646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dp总结
举报原因:
原因补充:

(最多只允许输入30个字)