动态规划及简单实例

一、动态规划

动态规划通常是用来求最优解问题的一种思路或方法。动态规划的基本思想是将要求解的问题分为若干子问题,当前子问题的最优解可以从上次子问题的解推出,从而求出原问题的最优解。
动态规划求解过程可简单分为两个步骤:前一子问题求出解时的状态和前一子问题到当前子问题的状态转移方程。

二、简单实例

最近遇到的使用动态规划求最优解的两个问题
1、在m*n的矩阵上,从左上角出发,每步只能向下走或向右走,每个位置上有一个数,将行走路线上所有经过的位置上的数值求和,求到达右下角时可以获得的最大值。
运用动态规划思想进行分析:到达第(i,j)位置时的最大值应该等于前一步(可能是(i-1,j)或(i,j-1))获得的最大值加上(i,j)位置的值(0 <= i < m, 0 <= j < n)。

算法思路如下:

(1)设每个位置的值为num[i][j],定义数组max[i][j]来存储每个位置的最大值;
(2)i=0,j=0;时,max[i][j] = num[i][j];(计算起始点)
(3)i=0,j!=0;时,max[i][j] = max[i][j-1] + num[i][j];
i!=0,j=0;时,max[i][j] = max[i-1][j] + num[i][j];(计算两条边界)
(4)i!=0,j!=0;时,max[i][j] = Max(max[i-1][j], max[i][j-1]) + num[i][j];
(5)最后max[m-1][n-1]即为所求。

代码实现-Java

2、最长回文子序列,一个字符串cbeffboc中可能存在回文的子序列,如c,cc,cbc,cbbc,cbffbc等,求最长回文子序列的长度。
运用动态规划的思想来考虑的话,当前串(cbeffboc)中最长回文子序列的长度可以由比其长度小的串(beffbo)中最长回文子序列的长度求出(+2)。
算法思路
(1)已知字符串数组str,长度len,设pN[i][j]表示str中第i位到j位子串的最长回文子序列的长度;
(2)子串长度为1时,其最长回文子序列长度为1,pN[i][j] = 1;
子串长度大于1时,对收尾字符串判断:
若相等,pN[i][j] = 2 + pN[i+1][j-1];
不等,pN[i][j] = Max(pN[i+1][j], pN[i][j-1]);
(3)最后可求出原字符串的最长回文子序列pN[0][len-1]

代码实现-Java

你可能感兴趣的:(数据结构算法)