日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划之强盗抢劫

發布時間:2025/6/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划之强盗抢劫 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ?題目:強盜搶劫一排房間,每個房間都藏著一定數量的錢,不能搶劫兩個相鄰的房間,要求搶的錢最多

?????????數組如:[2,7,9,3,1]

?????????當輸入的個數為0,1,2這個很好判斷,當輸入的數字大于3時,就要用到動態規劃了,方程是:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]),dp[i]是當搶到第i個數時,能搶到最大值,其思路是,從局部最大值推到最終結果最大。假如當我們搶到第5個房間,那這個第5個房間有二種情況,搶不和不被搶,因為只能隔一個房間搶一個,如果這時候搶到第4個房間有個最大值,搶到第3個房間有個最大值,如果第3個房間的最大值加上這第5個房間的值大于搶到第4個房間時的最大時,那就搶3,5而不搶4,反而,就按搶4的策略,這樣從前往后推,最后的結果一定是最大的。
? ? ? ? ?

#include<iostream> #include<vector> using namespace std;class Solution { public:int rob(vector<int>& nums) {int size = nums.size();if (size == 0) return 0;if (size == 1) return nums[0];vector<int> dp(size, 0);dp[0] = nums[0];dp[1] = nums[0]>nums[1] ? nums[0] : nums[1];cout << "dp[0]=" << dp[0]<< endl;cout << "dp[1]=" << dp[1]<< endl;cout << "-----------------------" << endl;for (int i = 2; i < size; ++i){cout << "dp[i - 2]=" << dp[i - 2] << endl;cout << "nums[i]=" << nums[i] << endl;cout << "dp[i - 1]=" << dp[i - 1] << endl;dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);cout << "dp=" << dp[i] << endl;cout << "-----------------------" << endl;}return dp[size - 1];} };int main(){vector<int> v={2,7,9,3,1}; Solution s;int n = s.rob(v);cout<< "n=" << n << endl; }

? ?

dp[0]=2
????dp[1]=7
????-----------------------i=3時,能搶到的最大值是11
????dp[i - 2]=2
????nums[i]=9
????dp[i - 1]=7
????dp=11
????-----------------------i=4時,能搶到的最大值是11
????dp[i - 2]=7
????nums[i]=3
????dp[i - 1]=11
????dp=11
????-----------------------i=5時,能搶到的最大值是12
???dp[i - 2]=11?
???nums[i]=1
???dp[i - 1]=11
???dp=12
??-----------------------
???n=12

???每次用新房間的值加上dp里面存儲的值,在和上一個dp里面的值進行比較,取其中較大的,這樣一直遞推下去。
?

參考地址:https://www.codeleading.com/article/400996440/

總結

以上是生活随笔為你收集整理的动态规划之强盗抢劫的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。