美文网首页
动态规划

动态规划

作者: 疯狂小王子 | 来源:发表于2017-06-18 22:17 被阅读0次

概述

动态规划提供了一种求最优问题的手段,本质上是通过合理的安排计算顺序而避免重复计算。解决动态规划问题主要在于2个方面:

  1. 寻找递归公式
  2. 确定计算顺序

题目

Longest Palindromic Subsequence

典型动态规划算法,递推公式如下:

d[i][j]表示在(i, j) 里面最长的回文子串,存在如下递推公式:
dp[i][j] = 
    dp[i+1][j-1] + 2,              if s[i] == s[j]
    max(dp[i][j-1], dp[i+1][j]),   if s[i] != s[j]

只要按照确定的顺序遍历,即可得到答案。可以辅助画一个二维数组图来获得遍历顺序, 可以发现按照如下顺序遍历可满足减少重复计算需求:

遍历顺序示意图

可以观察到i, j的距离是从0~size-1变化,具体代码如下:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int dp[s.length()][s.length()];
        memset(dp, 0, sizeof(int)* s.length() * s.length());
        int i, j;
        for (int dis = 0; dis < s.length(); ++dis) {
            for (i = 0; (j = i + dis) < s.length(); ++i) {
                if (dis == 0) {
                    dp[i][j] = 1;
                }
                else if (s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }
                else {
                    dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        return dp[0][s.length()-1];
    }
};

相关文章

网友评论

      本文标题:动态规划

      本文链接:https://www.haomeiwen.com/subject/baswqxtx.html