动态规划总结

本文详细介绍了动态规划的概念,包括递归、记忆化搜索、状态转移等基本概念,并探讨了动态规划的经典模型,如线性模型、区间模型、状态压缩模型和树状模型。此外,文章还阐述了动态规划的常用状态转移方程和优化技巧,如滚动数组、单调队列优化等。同时,对比了动态规划与贪心算法、分治法的区别,以及设计动态规划的思路和适用条件。
摘要由CSDN通过智能技术生成

目录

动态规划简介

递归

记忆化搜索

状态和状态转移    

子问题,最优子结构,最优化原理

决策和无后效性

简介

动态规划的经典模型

线性模型

区间模型

状态压缩模型

树状模型

动态规划的常用状态转移方程

1D/0D

1D/1D

2D/0D

2D/1D

2D/2D

复杂度

动态规划和数据结构结合的常用优化

滚动数组

缩小子问题的解的范围

单调队列优化

决策单调性

矩阵优化

斜率优化

树状数组优化

线段树优化

动态规划,贪心算法,分治法的区别

三者特征

分治算法

动态规划

贪心算法

区别

分治算法与动态规划 

贪心算法与动态规划算法 

适用条件 

贪心算法

动态规划

分治算法

动态规划设计思路


动态规划简介

递归

暂且先不说动态规划是怎么样一个算法,由最简单的递推问题说起应该是最恰当不过得了。因为一来,递推的思想非常浅显,从初中开始就已经有涉及,等差数列 f[i] = f[i-1] + d( i > 0, d为公差,f[0]为初项)就是最简单的递推公式之一;二来,递推作为动态规划的基本方法,对理解动态规划起着至关重要的作用。

记忆化搜索

递推说白了就是在知道前i-1项的值的前提下,计算第i项的值

而记忆化搜索则是另外一种思路。它是直接计算第i项,需要用到第 j 项的值( j < i)时去查表,如果表里已经有第 j 项的话,则直接取出来用,否则递归计算第 j 项,并且在计算完毕后把值记录在表中。记忆化搜索在求解多维的情况下(比如f(a,b))比递推更加方便

状态和状态转移    

在介绍递推和记忆化搜索的时候,都会涉及到一个词---状态,它表示了解决某一问题的中间结果,这是一个比较抽象的概念,例如f[i][j]FA[i]、FB[i]f[a][b][c],无论是递推还是记忆化搜索,首先要设计出合适的状态,然后通过状态的特征建立状态转移方程(f[i] = f[i-1] + f[i-2] 就是一个简单的状态转移方程)。

子问题,最优子结构,最优化原理

一个问题的解,可以先分解为求解一系列子问题的解,同时包含重叠子问题

子问题的解,可以根据状态转移,得到最终解。

如果子问题与子问题之间是不重叠的(他们两个的解不相关),那么直接用分治法即可。

如果子问题重叠了,就可以用动态规划求解,子问题的最优解可以推出原问题的最优解。

最优子结构:对于多阶段决策问题,如果每一个阶段的最优决策序列的子序列也是最优的,且决策序列具有“无后效性”,就可以将此决策方法理解为最优子结构。

最优子结构应该是大问题可以不断的分解为小问题,每个小问题的最优解可以得到相应大问题的最优解。

 如果问题的最优解包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

例如:

 d[i] = max{ d[j] | j < i && a[j] < a[i] } + 1

这个表达式很好的阐释了最优化原理,其中d[j]作为d[i]的子问题d[i]最长(优)当且仅当d[j]最长(优)

决策和无后效性

一个状态演变到另一个状态,往往是通过“决策”来进行的。有了“决策”,就会有状态转移。而

无后效性,就是一旦某个状态确定后,它之前的状态无法对它之后的状态产生“效应”(影响)。

无后效性:动态规划法的最优解通常是由一系列最优决策组成的决策序列,最优子结构就是这些最优决策序列中的一个子序列,对于每个子序列再做最优决策会产生新的最优决策(子)序列,如果某个决策只受当前最优决策子序列的影响,而不受当前决策可能产生的新的最优决策子序列的影响,则可以理解这个最优决策具有无后效性。

例如:现在有一个四乘四的网格,左上角有一个棋子,棋子每次只能往下走或者往右走,现在要让棋子走到右下角

 假设棋子走到了第二行第三列,记为s(2,3),如下图,画了两条路线和一条不符合题意的路线,那么当前的棋子[s(2,3)位置],怎么走到右下角和之前棋子是如何走到s(2,3)这个位置无关[不管是黑色尖头的路线还是蓝色箭头的路线]

换句话说,当位于s(2,3)的棋子要进行决策(向右或者向下走)的时候,之前棋子是如何走到s(2,3)这个位置的是不会影响我做这个决策的。

之前的决策不会影响了未来的决策(之前和未来相对于现在棋子位于s(2,3)的时刻),这就是无后效性,也就是所谓的“未来与过去无关” 

看完了无后效性,那我们再来看看有后效性,还是刚才的例子,只不过现在题目的条件变了,现在棋子可以上下左右走但是不能走重复的格子。那么现在红色箭头就是一个合法的路线了,当我的棋子走到了s(2,3)这个位置的时候,要进行下一步的决策的时候,这时候的决策是受之前棋子是如何走到s(2,3)的决策的影响的,比如说红色箭头的路线,如果是红色箭头决策而形成的路线,那么我下一步决策就不能往下走了。[因为题意要求不能走重复的格子],之前的决策影响了未来的决策,"之前影响了未来",这就叫做有后效性

 

简介

动态规划就是一种用来解决最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是,动态规划会将每个求解的子问题的解都记录下来。这样当下次碰到同样的子问题的时候 ,直接使用之前记录的结果。而不是重复计算。

采用动态规划需要满足的条件: 
(1)最优化原理(2)无后效性(两个中,一个不满足,就不能用动态规划。)

 

动态规划的经典模型

线性模型

  线性模型的是动态规划中最常用的模型,最长单调子序列就是经典的线性模型,这里的线性指的是状态的排布是呈线性的。

可以通过递归,或者每次将i+1,根据i之前的f(i)得到f(i+1)

典型例子是背包问题

例如:

f(i)=f(i-2)+f(i-1)

 opt[i] = min{opt[i-1] + a[1] + a[i] , opt[i-2] + a[1] + a[i] + 2*a[2] }

区间模型

 区间模型的状态表示一般为d[i][j],表示区间[i, j]上的最优解,然后通过状态转移计算出[i+1, j]或者[i, j+1]上的最优解,逐步扩大区间的范围,最终求得[1, len]的最优解。

一般用记忆化搜索。如果问题的状态并非线性的,用记忆化搜索来求解状态的值会事半功倍。

状态压缩模型

状态压缩的动态规划,一般处理的是数据规模较小的问题,将状态压缩成k进制的整数,k取2时最为常见。

例如:

状态:d[i][j][k]   d[(11101111)2][7][1]

转移: d[i][j][k] = max{ d[i ^ (1<<k)][t][j] + w(t, j, k)   |   (i & (1<<t)) != 0 } 

例如:

第M行状态可以分别表示为(101010) 2、(110111) 2、(011110) 2

d[i][j]  i或者j变成2进制的模式,好用来位运算

树状模型

树形动态规划(树形DP),是指状态图是一棵树,状态转移也发生在树上,父结点的值通过所有子结点计算完毕后得出。

例如:

给定一颗树,和树上每个结点的权值,求一颗非空子树,使得权和最大。

用d[1][i] 表示i这个结点选中的情况下,以i为根的子树的权和最大值;

用d[0][i]表示i这个结点不选中的情况下,以i为根的子树的权和最大值;

d[1][i] = v[i] + sum{ d[1][v] | v是i的直接子结点 &&a

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值