動態規劃(1)

1.basic skills:遞歸+暴力搜索算法

2.動態規劃Dynamic Programming(DP)編程

(1)本質:遞歸。遞歸不能解決的問題動態規劃也不能解決。數組

(2)原問題(N)-   >子問題->原問題(N)。把原問題拆解成子問題,在獲得子問題的答案以後再獲得原問題的答案。遞歸關注的是解決問題的方式,怎麼把很複雜的問題拆解成一層一層的,遞歸的時間複雜度是多少等寫完以後再說。spa

(3)最優子結構:子問題的最優決策能夠導出原問題的最優決策設計

(4)無後效性。code

(5)重疊子問題:去冗餘,空間換時間。blog

3.target:分析-->coding->ac遞歸

4.leetcode實訓leetcode

(198搶劫)代碼:get

去冗餘以前

package com.nowcoder.leetcode;

public class HouseRobber_198 {
    //遞歸的方式,idx表明已經搶到的位置,
    public static int solve1(int idx,int[] nums){
        //越界就返回
        if(idx<0){
            return 0;
        }
        return Math.max(nums[idx]+solve1(idx-2,nums),solve1(idx-1,nums));
    }
    //第一種方法暴力遞歸
    public static int rob(int[] nums){
        return solve1(nums.length,nums);

    }


}

去冗餘以後

class Solution {
   public static int[] res;
   public int solve(int idx,int[] nums){
       if(idx<0){
           return 0;
       }
       if(res[idx]>=0){
           return res[idx];
       }
       res[idx]=Math.max(nums[idx]+solve(idx-2,nums),solve(idx-1,nums));
        return res[idx];
   }
   public int rob(int[] nums){
       res=new int[nums.length];
       for(int i = 0 ; i<nums.length;++i){
           res[i]=-1;
       }
       return solve(nums.length-1,nums);
   }
}

5.共性問題:

(1)套路:最優,最大,最小,最長,計數

(2)離散問題:容易設計狀態(整數的01揹包問題)

(3)最優子結構:N-1能夠推導出N

6.基本步驟:四個步驟

(1)涉及暴力算法,找到冗餘

(2)設計並存儲堆的狀態(一維、二維、三維數組甚至是用Map)

(3)遞歸式(狀態轉移方程):遞歸中有兩個值組成,每一個值表明一種決策,每一個決策裏面都有一個遞歸。

(4)自底向上計算最優解(編程方式):先計算比較大的,而後計算比較小的,可是自頂向下代碼量比較大的。自底向上是先計算比較小的,

相關文章
相關標籤/搜索