动态规划的递归写法和递推写法详解

您所在的位置:网站首页 递推计数详解 动态规划的递归写法和递推写法详解

动态规划的递归写法和递推写法详解

2024-07-11 14:57| 来源: 网络整理| 查看: 265

目录

动态规划的概念

动态规划的递归写法

动态规划的递推写法

动态规划的概念

动态规划是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是,动态规划会将每个求解过的子问题的解记录下来,这样当下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算。注意:虽然动态规划采用这种方式来提高计算效率,但不能说这种做法就是动态规划的核心。

动态规划的递归写法

以斐波那契数列为例,斐波那契数列的定义为F_{0}=1,F_{1}=1,F_{n}=F_{n-1}+F_{n-2}\left ( n\geqslant 2 \right )

int F(int n){ if(n==0||n==1){ return 1; } else{ return F(n-1)+F(n-2); } }

为了避免重复计算,可以开一个一维数组dp,用以保存已经计算过的结果,其中dp[n]记录F(n)的结果,并用dp[n]==-1表示F(n)当前还没有被计算过。

int dp[maxn];

然后就可以在递归当中判断dp[n]是否为-1:如果不是-1,说明已经计算过F(n),直接返回dp[n]就是结果;否则,按照递归式进行递归。代码如下:

int F(int n){ if(n==0||n==1){ return 1; } if(dp[n]!=-1){ return dp[n]; } else{ dp[n]=F(n-1)+F(n-2); return dp[n]; } }

这样就把已经计算过的内容记录下来,于是当下次再碰到需要计算相同的内容时,就能直接使用上次计算的结果,这可以省去大半无效计算,而这也是记忆化搜索这个名字的由来。

通过上面的例子可以引申出一个概念:如果一个问题可以被分解为若干个子问题,且这些子问题会重复出现,那么就称这个问题拥有重叠子问题。动态规划通过记录重叠子问题的解,来使下次碰到相同的子问题时直接使用之前记录的结果,以此避免大量重复计算。因此,一个问题必须拥有重叠子问题,才能使用动态规划去解决。

动态规划的递推写法

以经典的数塔问题为例,将一些数字排成数塔的形状,其中第一层有一个数字,第二层有两个数字…第n层有n个数字。现在要从第一层走到第n层,每次只能走向下一层连接的两个数字中的一个,问:最后将路径上所有数字相加后得到的和最大是多少?

针对这个问题,枚举的话时间复杂度太高。不妨令dp[i][j]表示第i行第j个数字出发的到达最底层的所有路径中能得到的最大和。在定义这个数组之后,dp[1][1]就是最终想要的答案。

同时,我们可以考虑到如果要求出dp[i][j],那么一定要先求出它的两个子问题“从位置(i+1,j)到达最底层的最大和dp[i+1][j]”和"从位置(i+1,j+1)到达最底层的最大和dp[i+1][j+1]“,即进行了一次决策:走位置(i,j)的左下还是右下。于是dp[i][j]就是dp[i+1][j]和dp[i+1][j+1]的较大值加上f[i][j]。写成式子就是:dp[i][j]=max\left ( dp[i+1][j], dp[i+1][j+1]\right )+f[i][j].

把dp[i][j]称为问题的状态,而把上面的式子称作状态转移方程,它把状态dp[i][j]转移为dp[i+1][j]和dp[i+1][j+1]。可以发现,状态dp[i][j]只与第i+1层的状态有关,而与其他层的状态无关,这样层号为i的状态总是可以由层号为i+1的两个子状态得到。那么,如果总是将层号增大可以发现数塔的最后一层的dp值总是等于元素本身,即dp[n][j]=f[n][j],把这种可以直接确定其结果的部分称为边界,而动态规划的递推写法总是从这些边界出发,通过状态转移方程扩散到整个dp数组。

这样就可以从最底层各位置的dp值开始,不断往上求出每一层各位置的dp值,最后就得到dp[1][1],即为最后得到的答案。

#include #include using namespace std; const int maxn=1000; int f[maxn][maxn],dp[maxn][maxn]; int main(){ int n; cin>>n; for(int i=1;if[i][j]; } } for(int j=1;j=1;i--){ for(int j=1;j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3