动态规划

概述

动态规划提供了一种求最优问题的手段,本质上是通过合理的安排计算顺序而避免重复计算。解决动态规划问题主要在于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];
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,399评论 0 18
  • 今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实...
    mrlevo520阅读 13,211评论 1 22
  • 一个字符串的子串是字符串中连续的一个序列,而一个字符串的子序列是字符串中保持相对位置的字符序列,譬如,"adi"可...
    AwesomeAshe阅读 1,206评论 0 0
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,843评论 0 89
  • 1 概述 前面的课程中讲到了图的基本遍历算法和简单的应用,本来想接着往后面继续讲,后来有童鞋说讲讲动态规划吧,看书...
    CodingTech阅读 1,599评论 2 13