動態規劃的思想對於解決最優問題通常非常有效,用動態規劃解決的問題通常具備兩個基本特性:最優子結構和重複子問題;這兩個特性確保問題可以被切分爲更小的問題,在數學上的體現就是遞推式,所以假如一個問題的解決方案可以抽象爲一個遞推式,則該問題用動態規劃解決通常會非常有效,一個簡單的例子就是斐波那契額數列;其變種包括:一隻青蛙每次可以跳一步或兩步,則跳N步有幾種方案;下面我們來看一下LeetCode上的幾個用動態規劃解決的例子:
Palindrome Patitioning II: https://oj.leetcode.com/problems/palindrome-partitioning-ii/
在該例子中,採用了一個輔助數組cuts,其中cuts[i]記錄的是s[0] ~ s[i-1]之間的最小cut數加1,所以我們最後只需要返回s[s.length()]-1;
<span style="font-size:12px;">public class Solution {
public int minCut(String s) {
if(s == null || s.length() == 0)
return 0;
int len = s.length();
int[] cuts = new int[len+1];
boolean[][] matrix = new boolean[len][len];
for(int i = 0;i <= len; i++){
cuts[i] = i;
}
for(int j = 0; j < len; j++){
for(int i = j; i >= 0; i--){
if((j-i < 2 || matrix[i+1][j-1]) && s.charAt(i) == s.charAt(j)){
matrix[i][j] = true;
cuts[j+1] = Math.min(cuts[j+1], cuts[i]+1);
}
}
}
return cuts[len]-1;
}
}</span>
未完待更新。。。