動態規劃 打家劫舍

2021-10-10 23:20:14 字數 2403 閱讀 4959

遵紀守法,人人有責!

動態規劃(dynamic programming,dp)是運籌學的乙個分支,是求解決策過程最優化的過程。

通俗點:對於某類問題,可以拆分成若干個子問題,按照順序求解子問題的解,前乙個子問題的解,為後乙個問題提供相關資訊,每個子問題的解不能隨意確定。依次下去,就能形成一條解決問題的子集解集合。總之一句話就是,大事化小,小事化了。

階段:把所給求解問題的過程恰當地分成若干個相互聯絡的階段,以便於求解,過程不同,階段數就可能不同.描述階段的變數稱為階段變數。在多數情況下,階段變數是離散的,用k表示。此外,也有階段變數是連續的情形。如果過程可以在任何時刻作出決策,且在任意兩個不同的時刻之間允許有無窮多個決策時,階段變數就是連續的。

狀態:狀態表示每個階段開始面臨的自然狀況或客觀條件,它不以人們的主觀意志為轉移,也稱為不可控因素。在上面的例子中狀態就是某階段的出發位置,它既是該階段某路的起點,同時又是前一階段某支路的終點。

無後效性:我們要求狀態具有下面的性質:如果給定某一階段的狀態,則在這一階段以後過程的發展不受這階段以前各段狀態的影響,所有各階段都確定時,整個過程也就確定了。換句話說,過程的每一次實現可以用乙個狀態序列表示,在前面的例子中每階段的狀態是該線路的始點,確定了這些點的序列,整個線路也就完全確定。從某一階段以後的線路開始,當這段的始點給定時,不受以前線路(所通過的點)的影響。狀態的這個性質意味著過程的歷史只能通過當前的狀態去影響它的未來的發展,這個性質稱為無後效性。

決策:乙個階段的狀態給定以後,從該狀態演變到下一階段某個狀態的一種選擇(行動)稱為決策。在最優控制中,也稱為控制。在許多問題中,決策可以自然而然地表示為乙個數或一組數。不同的決策對應著不同的數值。描述決策的變數稱決策變數,因狀態滿足無後效性,故在每個階段選擇決策時只需考慮當前的狀態而無須考慮過程的歷史。

策略:由每個階段的決策組成的序列稱為策略。對於每乙個實際的多階段決策過程,可供選取的策略有一定的範圍限制,這個範圍稱為允許策略集合。

允許策略集合中達到最優效果的策略稱為最優策略。

上述術語比較專業化,還是需要根據具體的問題來理解。

多階段決策,意味著問題可以分解成子問題,子子問題,。。。,也就是說問題可以拆分成多個子問題進行求解。

最優子結構,在自下而上的遞推過程中,我們求得的每個子問題一定是全域性最優解,既然它分解的子問題是全域性最優解,那麼依賴於它們解的原問題自然也是全域性最優解。

自下而上,怎樣才能自下而上的求出每個子問題的最優解呢,可以肯定子問題之間是有一定聯絡的,即迭代遞推公式,也叫「狀態轉移方程」,要定義好這個狀態轉移方程, 我們就需要定義好每個子問題的狀態(dp 狀態),那為啥要自下而上地求解呢,因為如果採用像遞迴這樣自頂向下的求解方式,子問題之間可能存在大量的重疊,大量地重疊子問題意味著大量地重複計算,這樣時間複雜度很可能呈指數級上公升,所以自下而上的求解方式可以消除重疊子問題。

多階段決策問題中,各個階段採取的決策,一般來說是與時間有關的,決策依賴於當前狀態,又隨即引起狀態的轉移,乙個決策序列就是在變化的狀態中產生出來的,故有「動態」的含義,稱這種解決多階段決策最優化問題的方法為動態規劃方法。

備註:感覺像這種比較難以理解的問題,需要多刷題,找到問題中的相似點,題目做多了,以後遇到這類問題就能很快的找到解題思路,光看概念之類的東西真的很難理解,這個只是個人理解。

題目中規定,第乙個房間和最後乙個房間是連線在一起的,所以整個陣列理論上是乙個環形結構,所以選擇第乙個數,就不能選擇最後乙個數。選擇最後乙個數,就不能選擇第乙個數。所以最後歸結為:

1.在不選第乙個數的情況下nums[ n - 1 ],獲得的最大金額為p1;

2.在不選擇最後乙個數的情況下num[ 1 ],獲得的最大金額為p2;

然後只需要比較max(p1,p2),即可獲得最大金額。

狀態轉移方程:f(n) = max( nums[n] + f(n-2) , f(n-1) )

**如下:

class solution 

int subrob(vector& nums,int start,int end){

int prev = 0;

int cur = 0;

for(int i=start;i我們發現 dp[n]只與 dp[n-1]和 dp[n-2]有關係,因此我們可以設兩個變數 cur和 prev 交替記錄,將空間複雜度降到 o(1)。

prev表示前n-1的值,cur表示n的值,prev的值也就是cur未進行下一次計算的值。nums[i]+prev表示當前房間的金額加上前n-1房間中的最大金額。

(後續有新的理解再更新...)

動態規劃 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

打家劫舍 動態規劃

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

打家劫舍(動態規劃)

打家劫舍 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。考慮所有...