動態規劃

概述

動態規劃提供了一種求最優問題的手段,本質上是通過合理的安排計算順序而避免重復計算。解決動態規劃問題主要在于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,327評論 0 18
  • 今天整理了一下關于動態規劃的內容,道理都知道,但是python來描述的方面參考較少,整理如下,希望對你有所幫助,實...
    mrlevo520閱讀 13,127評論 1 22
  • 一個字符串的子串是字符串中連續的一個序列,而一個字符串的子序列是字符串中保持相對位置的字符序列,譬如,"adi"可...
    AwesomeAshe閱讀 1,193評論 0 0
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規模的大小,而是從問題的最明顯的最小規模開始逐步求解出可能的答案,并...
    fredal閱讀 13,728評論 0 89
  • 1 概述 前面的課程中講到了圖的基本遍歷算法和簡單的應用,本來想接著往后面繼續講,后來有童鞋說講講動態規劃吧,看書...
    CodingTech閱讀 1,569評論 2 13