動態規劃演算法

2021-10-12 01:43:40 字數 1338 閱讀 4545

斐波那契數列

斐波那契數列不算動態規劃,但是解決問題的思路與動態規劃很像,再加上大家上學的時候基本都接觸過斐波那契數列,通過它來理解動態規劃就很不錯了。

斐波那契數列的數學形式就是遞迴的,寫成**就是這樣:

int fib(int n)

這個遞迴,相信有不少人能看出問題,子問題被不斷計算,以n=20為例

fib(20) = fib(19) + fib(18) = fib(18) + fib(17) + fib(18)

寫到這裡,已經發現,fib(18)已經被計算多次,效率很低下。

所以引入帶備忘錄的遞迴演算法,把每次計算的子結果的值進行儲存,後面就不需要重複計算了。整改之後的**

int fib(int n)

return dp[n];

}斐波那契數列

例子:最長回文串

問題:給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

輸入: 「babad」

輸出: 「bab」

注意: 「aba」 也是乙個有效答案。

思路:對於乙個子串而言,如果它是回文串,並且長度大於2,那麼將它首尾的兩個字母去除之後,它仍然是個回文串。例如對於字串「ababa」,如果我們已經知道「bab」 是回文串,那麼「ababa」 一定是回文串,這是因為它的首尾兩個字母都是「a」。

於是得到我們的狀態轉移方程:

dp[i][j] 表示i到j之間的字串是否是回文串

dp[i][j] = dp[i+1][j-1] and (s[i] eq s[j])

最小子問題:當s[i] eq s[j],子串長度是2或3,不需要檢查子串是否回文串,即j-i<=2

public string longestpalindrome(string s)

int len = s.length();

int maxlen = 1;

int left = 0;

int right = 0;

boolean dp = new boolean[len][len];

char chars = s.tochararray();

// 如果i從0開始,那麼對應abba這樣的字串,bb這個子串在遍歷過程中沒法被當做子問題進行儲存

for (int i=len-2; i>=0; i--)

dp[i][j] = true;

}else if (dp[i+1][j-1])

dp[i][j] = true;}}

}}return s.substring(left, right + 1);

}

亞馬遜測評 www.yisuping.com

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...