DP思想

本文介绍了动态规划的基本概念,包括如何将复杂问题分解为子问题并使用递归来求解,同时探讨了如何通过保存中间结果避免重复计算。文章还对比了备忘录方法与传统动态规划的不同之处,并给出了一种计算矩阵连乘积的具体算法实现。

定义:将一个问题分解为子问题递归求解(小问题按阶段分),并且将中间结果保存以避免重复计算的办法,就叫做“动态规划”。

阶段:运用动态规划首先需要将问题的全过程恰当地划分成若干个相互联系的阶段,以便按一定的次序去求解。阶段的划分一般是根据时间和空间的自然特征来定的,一般要便于把问题转化成多阶段决策的过程

大多数情况下,DP可以用来求最优值,这里要注意,DP求最优值不是递推,而是枚举。要考虑清楚每个阶段,并表示出来。然后寻找终止条件,这里常常把每个阶段的最值保存起来,然后在最值里面求最值。

备忘录方法 :备忘录方法是递归方式的变形。它与动态规划方法一样备忘录方法采用用一个表保存已解决的子问题的答案,而且在计算时间上与动态规划一致,都是O(n^3)。与动态规划不同的是,备忘录方法采用的是自顶向下的递归方式,而动态规划则是采用自下向上的非递归方式。

计算矩阵连乘积的备忘录算法:

int  LookChain()

{

if(m[i][j]>0)return m[i][j];//在调用LookChain之前,数组m要清零,表示对应的子问题还未解决。

if (i==j) return 0;

int u=LookChain(i,i)+LookChain(i+1,j)+p[i-1]*p[i]*p[j];

s[i][j]=i;

for(int k=i+1;k<j;k++)

{

int t=LookChain(i,k)+LookChain(k+1,j)+p[i-1]*p[k]*p[j];

if(t<u){u=t;s[i][j]=k;}

}

m[i][j]=u;

return u;

}

当子问题空间中的部分子问题不必求解时,用备忘录方法则效率较高,因为从其控制结构可以看出,该方法只解那些确实需要求解的子问题。

 

想要用好动态规划,必须得学会转化思考角度,充分利用空间来节省时间。

 

 

转载于:https://www.cnblogs.com/You-Change/p/3245795.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值