动态规划的思想对于解决最优问题通常非常有效,用动态规划解决的问题通常具备两个基本特性:最优子结构和重复子问题;这两个特性确保问题可以被切分为更小的问题,在数学上的体现就是递推式,所以假如一个问题的解决方案可以抽象为一个递推式,则该问题用动态规划解决通常会非常有效,一个简单的例子就是斐波那契额数列;其变种包括:一只青蛙每次可以跳一步或两步,则跳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>
未完待更新。。。