最火的瓜,得用動態規劃來喫
今天真是被羅志祥的大瓜砸到了!全網絡都是關於“小豬”的新聞,這前女友公開喫瓜確實強悍!
“小豬”是怎麼管理時間的?作爲程序員,感覺這是一個很有技術的優化問題,稱爲動態規劃~!
你不懂?
沒關係,我快速教會你。
一、 遞歸樹分析
直接掏出大殺器“遞歸樹“”進行分析。
先來把數據整理一下:
愉悅度 = [60, 100, 120]
時間成本 = [10, 20, 25]
總時間 = 30
總人數 = 3
構造函數tm(總時間 , 時間成本 , 愉悅度 , 總人數),我們可以先分析c小姐:
無非兩種情況,約和不約,如果在最優方案裏面約c小姐,那你就應該在總時間30裏面減去25,同時收穫愉悅度+120,如果不約最優方案裏面你可以使用的時間還是30。
不管你約或者不約,接下來我們都不用考慮c小姐對最優方案的影響了。
接下來我把完整的遞歸樹畫出來,因爲空間問題,我省略了不變的時間成本和愉悅度參數。
這裏需要說明的是比如b小姐的tm(5-20,1)這種情況,說明剩下的時間不滿足約會b小姐,所以可以跳過這種情況,直接5小時保持不變,直接考慮下一種“總人數-1”的情況,本例中就是"1-1",所以下一種情況的表達函數就是tm(5, 0)。自然在這種情況下,也不能收穫愉悅度。
還有就是當總人數爲0,或者總時間爲0的時候,我們直接返回0就好,這個時候的情況就是要麼是沒有人可以約了,要麼就是沒有時間可以約人了,所以也就沒有辦法收穫愉悅度了。
`
二、 動態規劃的代碼
經過遞歸樹的分析,如果規模比較大,你會發現有很多子問題都重複計算了,這個時候你就可以利用用空間換時間的思想去優化你代碼的時間複雜度,這也就是動態規劃的最後一步。
最開始直接用遞歸解決的代碼
def tm(total_time , time_cost , profit , n):
if n == 0 or total_time == 0 :
return 0
if time_cost[n-1] > total_time:
res = ans(total_time , time_cost , profit , n-1)
return res
else:
res = max(profit[n-1] + tm(total_time-time_cost[n-1] , time_cost , profit , n-1),
tm(total_time , time_cost , profit , n-1))
return res
profit = [60, 100, 120]
time_cost = [10, 20, 25]
total_time = 30
n = len(profit)
print(tm(total_time , time_cost , profit , n))
加上cache之後,從上到下進行優化的代碼
def tm(total_time , time_cost , profit , n):
if n == 0 or total_time == 0 :
return 0
if dp[n-1][total_time-1] != 0 :
return dp[n-1][total_time-1]
if time_cost[n-1] > total_time:
res = ans(total_time , time_cost , profit , n-1)
dp[n-1][total_time-1] = res
return res
else:
res = max(profit[n-1] + tm(total_time-time_cost[n-1] , time_cost , profit , n-1),
tm(total_time , time_cost , profit , n-1))
dp[n-1][total_time-1] = res
return res
profit = [60, 100, 120]
time_cost = [10, 20, 25]
total_time = 30
n = len(profit)
dp = [[0] * (total_time) for _ in range(n)]
print(tm(total_time , time_cost , profit , n))
三、 與妹子溝通是個技術活
很多人做覺得算法只是解決工程問題,其實生活中的各種問題你都可以用算法的視角去觀察。
只有這樣你纔會發現像“小豬”這樣的高手!
時間是有限的,妹子是有限的,如何在有限的時間裏與妹子最愉悅的在一起是一個技術活!
如果對動態規劃感興趣可以觀察我的視頻,持續更新中。
就這一次幹翻動態規劃 - Longest Common Subsequence
就這一次幹翻動態規劃 Longest Increasing Subsequence