斐波那契數列
斐波那契數列不算動態規劃,但是解決問題的思路與動態規劃很像,再加上大家上學的時候基本都接觸過斐波那契數列,通過它來理解動態規劃就很不錯了。
斐波那契數列的數學形式就是遞迴的,寫成**就是這樣:
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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...