力扣198 打家劫舍
力扣 198.打家劫舍
題目型別:動態規劃,類似爬樓梯,但這道題更好,爬樓梯雖然寫了很多解法,但是總給人一種只能解決斐波那契數列的問題(其實是斐波那契滿足了動態規劃的某些條件)。而這道題讓我知道了動態規劃問題的意義。
多決策問題時候用動態規劃,什麼是多決策問題呢?
階段:把所給求解問題的過程恰當地分成若干個相互聯絡的階段,以便於求解,過程不同,階段數就可能不同.描述階段的變數稱為階段變數。在多數情況下,階段變數是離散的,用k表示。此外,也有階段變數是連續的情形。如果過程可以在任何時刻作出決策,且在任意兩個不同的時刻之間允許有無窮多個決策時,階段變數就是連續的 [6] 。
狀態:狀態表示每個階段開始面臨的自然狀況或客觀條件,它不以人們的主觀意志為轉移,也稱為不可控因素。在上面的例子中狀態就是某階段的出發位置,它既是該階段某路的起點,同時又是前一階段某支路的終點 [6] 。
無後效性:我們要求狀態具有下面的性質:如果給定某一階段的狀態,則在這一階段以後過程的發展不受這階段以前各段狀態的影響,所有各階段都確定時,整個過程也就確定了。換句話說,過程的每一次實現可以用一個狀態序列表示,在前面的例子中每階段的狀態是該線路的始點,確定了這些點的序列,整個線路也就完全確定。從某一階段以後的線路開始,當這段的始點給定時,不受以前線路(所通過的點)的影響。狀態的這個性質意味著過程的歷史只能通過當前的狀態去影響它的未來的發展,這個性質稱為無後效性 [6] 。
決策:一個階段的狀態給定以後,從該狀態演變到下一階段某個狀態的一種選擇(行動)稱為決策。在最優控制中,也稱為控制。在許多問題中,決策可以自然而然地表示為一個數或一組數。不同的決策對應著不同的數值。描述決策的變數稱
決策變數的範圍稱為允許決策集合 [6] 。
策略:由每個階段的決策組成的序列稱為策略。對於每一個實際的多階段決策過程,可供選取的策略有一定的範圍限制,這個範圍稱為允許策略集合
那這個分析之後
f(0) = 0;f(1)=1;f(n) = Max(f(n-1),f(n-2)+num[n]);
那這個就可以用滾動陣列來寫了
class Solution { public int rob(int[] nums) { int len = nums.length; int[] state = new int[2]; if(len==0) return 0; if(len==1) return nums[0]; state[0] = 0; state[1] =nums[0]; int temp = 0; for(int i=1;i<len;i++){ temp = state[1]; state[1] = Math.max(state[1],state[0]+nums[i]); state[0] =temp; } return state[1]; } }