動態規劃解決經典問題

動態規劃的思想對於解決最優問題通常非常有效,用動態規劃解決的問題通常具備兩個基本特性:最優子結構和重複子問題;這兩個特性確保問題可以被切分爲更小的問題,在數學上的體現就是遞推式,所以假如一個問題的解決方案可以抽象爲一個遞推式,則該問題用動態規劃解決通常會非常有效,一個簡單的例子就是斐波那契額數列;其變種包括:一隻青蛙每次可以跳一步或兩步,則跳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>
未完待更新。。。

發佈了65 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章