动态规划解题思路

天天见闻 天天见闻 2023-05-16 财经 阅读: 86
摘要: 我的理解是,根据问题的可能性,将问题分一级传递或返回来实现。也可以说是对程序的友好性(即上次所说的状态转移方程)。经典的数字三角形问题(简单理解:上述解答过程,时间复杂程度大得不可想象,以便向前推时可以使用上一步的最佳解题,那是因为他多次反复计算对他拥有的数字的解释。首先,递归应该是我们解决动态规划问题的最常见的方法。那么,递归-东奎的一般转换方法如下:

由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

(来自百度百科)

说实话,没有动态规划的基础很难看懂,但是也能从中看出一些信息,下面我翻译成人话:

首先是拆分问题,我的理解就是根据问题的可能性把问题划分成一步一步这样就可以通过递推或者递归来实现.

关键就是这个步骤,动态规划有一类问题就是从后往前推到,有时候我们很容易知道:如果只有一种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前一步推导,得到前一步的最佳选择

然后就是定义问题状态和状态之间的关系,我的理解是前面拆分的步骤之间的关系,用一种量化的形式表现出来,类似于高中学的推导公式,因为这种式子很容易用程序写出来,也可以说对程序比较亲和(也就是最后所说的状态转移方程式)

我们再来看定义的下面的两段,我的理解是比如我们找到最优解,我们应该讲最优解保存下来,为了往前推导时能够使用前一步的最优解,在这个过程中难免有一些相比于最优解差的解,此时我们应该放弃,只保存最优解,这样我们每一次都把最优解保存了下来,大大降低了时间复杂度

说很难理解清楚,容易懵懵懂懂的,所以下面结合实例看一下(建议结合实例,纸上谈兵不太好):

经典的数字三角形问题(简单易懂,经典动态规划);

可以看出每走第n行第m列时有两种后续:向下或者向右下

由于最后一行可以确定,当做边界条件,所以我们自然而然想到递归求解

解题思路:

下面简单写一下java代码:

//java代码纯属自己练习,标准答案参考上面的c语言答案
class solution{
	public int getMax(){
		int MAX = 101;
		int[][] D = new int[MAX][MAX];   //存储数字三角形
		int n;              //n表示层数
		int i = 0; int j = 0;
		int maxSum = getMaxSum(D,n,i,j);
		return maxSum;
	}
	public int getMaxSum(int[][] D,int n,int i,int j){
		if(i == n){
			return D[i][j];
		}
		int x = getMaxSum(D,n,i+1,j);
		int y = getMaxSum(D,n,i+1,j+1);
		return Math.max(x,y)+D[i][j];
	}
}

其实仔细观察,上面的解答过程时间复杂度难以想象的大,那是因为他对有的数字的解进行了多次的重复计算,具体如下图:

如果不明白上图,可以把每条路径都画出来,观察每个数字有多少条路径经过了他,就会一目了然

然后我们就可以自然而然的想到,如果我们每次都把结果保存下来,复杂度就会大大降低

其实答案很简单:

其实,仔细观察该解题过程,该过程就是标准的动态规划解题过程,如果把该过程画出来(找到每一步的最优解,其他的舍弃)对动态规划会有更深刻的解法

还有就是,递推的另一个好处是可以进行空间优化,如图:

下面总结一下动态规划的解题一般思路:

首先递归应该是我们解决动态规划问题最常用的方法,帅,速度不算太慢

那么递归到动规的一般转化方法为:

如果该递归函数有n个参数,那么就定义一个n维数组,数组下标是递归函数参数的取值范围(也就是数组每一维的大小).数组元素的值就是递归函数的返回值(初始化为一个标志值,表明还未被填充),这样就可以从边界值开始逐步的填充数组,相当于计算递归函数的逆过程(这和前面所说的推导过程应该是相同的).

动规解题的一般思路(标准官方,不过经过前边讲解应该就能理解了):

将原问题分解为子问题(开头已经介绍了怎么分解)

(注意:1,子问题与原问题形式相同或类似,只是问题规模变小了,从而变简单了;

2,子问题一旦求出就要保存下来,保证每个子问题只求解一遍)

确定状态(状态:在动规解题中,我们将和子问题相关的各个变量的一组取值,称之为一个"状态",一个状态对应一个或多个子问题所谓的在某个状态的值,这个就是状态所对应的子问题的解,所有状态的集合称为"状态空间".我的理解就是状态就是某个问题某组变量,状态空间就是该问题的所有组变量) 另外:整个问题的时间复杂度就是状态数目乘以每个状态所需要的时间

确定一些初始状态(边界条件)的值 (这个视情况而定,千万别以为就是最简单的那个子问题解,上面只是例子,真正实践动规千变万化)

确定状态转移方程 (这一步和第三步是最关键的 记住"人人为我"递推,由已知推未知)

适合使用动规求解的问题:

1,问题具有最优子结构

2,无后效性 说的花里胡哨的,其实一般遇到求最优解问题一般适合使用动态规划

其他相关
新函数MAKEARRAY,同时查找多个查找值并返回多列数据

新函数MAKEARRAY,同时查找多个查找值并返回多列数据

作者: 天天见闻 时间:2024-04-25 阅读: 1
3)同时查找多个查找值并返回多列不管是还是,都只能是:要么同时查找多个查找值,返回单列数据;要么查找一个值,但可以同时返回多列值。它们不可能同时查找多个查找值并返回多列值。但冲着它搞定了同时查找多个查找值并返回多列数据的难点,也值得大家了解和学习。...
通达信副图指标超跌底部(附源码)

通达信副图指标超跌底部(附源码)

作者: 天天见闻 时间:2024-04-14 阅读: 2
CU:=SMA(CP,W,1);(CZ,RGB(10,50,10),-90,RGB(150,0,0));(CROSS(CZ,100),135,坑爹),;(CROSS(-100,CU),-125,关注),;(CROSS(-100,CZ),-120,超跌部落),;...
FLUENT阻力系数和升力系数计算案例

FLUENT阻力系数和升力系数计算案例

作者: 天天见闻 时间:2024-03-02 阅读: 30
今天,我们做一个非常经典的简化小车模型的阻力系数和升力系数计算案例。本案例计算阻力系数和升力系数,根据相关定义,需要设置如下参考值。首先,我们看一下阻力系数和升力系数的监视结果,可以看出经过约200次迭代计算后达到收敛。本案例的阻力系数和升力系数计算结果同参考文献结果对比如下。...
如何在闪光灯上创建动态板?

如何在闪光灯上创建动态板?

作者: 天天见闻 时间:2024-02-03 阅读: 36
方法一:选中股票-鼠标右键-加入板块股-自定义板块,则出现选股弹窗,在搜索框中输入选股问句,可以自动筛选出符合条件的股票,点击“创建条件为动态板块”,则可以创建动态板块。方法二:在阅读资讯时,选中选股问句创建为动态板块;使用问财选股时,可以直接点击“加入动态板块”,将选股问句保存为动态板块...
这是男人要和你“假分手”的表现。女人不要真诚。他依然爱着你。

这是男人要和你“假分手”的表现。女人不要真诚。他依然爱着你。

作者: 天天见闻 时间:2024-01-20 阅读: 34
一个男人,如果对这个女人不再爱了,一定会拉黑她,不再关注她。看着男朋友憨厚的样子,小姝心里还是很感动的,后悔当初一时冲动分了手,可是她也不知道男朋友心里还有没有她,她只能做一番感谢,然后送走别人。这时,女人就要抓住机会,别把爱你的男人弄丢了。如果女人和男人分手后,他对你还有这样的表现,说明还在爱你。...
苹果合作研发突破性算法,可从动态 RGB 图像中实时重建 3D 图像

苹果合作研发突破性算法,可从动态 RGB 图像中实时重建 3D 图像

作者: 天天见闻 时间:2023-11-18 阅读: 45
据IT之家11月2日消息,苹果公司近日与加州大学圣芭芭拉分校的研究人员共同演示并介绍了一种划时代的算法,可以从视频RGB图像在线重构3D图像。 双方团队将挑战低纹理区域,尝试解决重构图像固有的模糊性,将目光投向实时执行的实用解决方案,未来将引入智能手机等移动设备。 新算法根据历史当前观测结果生成准确的增量重构,解决了同步定位和地图映射(SLAM)系统的动态特性,确保了与SLAM更新的一致。 以前在密集的纯RGB重构中,极大地忽略了在线应用中相机姿态估计的动态特性,在重构过程中仍然采用静态输入图像的传统表现。...
我来说两句

年度爆文