動態規劃——C++做打家劫舍Ⅱ,接Ⅰ直接用降低空間複雜度的方法

思路

頭尾相連意味着頭尾只能搶一個,那我們可以把搶劫的區間分成兩個,[0, n-2]和[1, n-1],分別進行dp再取最大值
和Ⅰ一樣,重點是弄明白dp[i]在這邊即dp_i的意義,是表示從第i間房子開始搶能夠得到的最大的數值

//第一個和最後一個是相鄰的,即首位不能同時被搶
class Solution {
public:
    int robRange(vector<int>&nums, int start, int end)
    {
        int dp_i_1 = 0;//not_rober
        int dp_i_2 = 0; //do_rober
        int dp_i;//current house
        //就跟Ⅰ一眼的動態規劃了
        for(int i = end; i>= start; i--)//從這件房子開始搶
        {
            dp_i = max(dp_i_1, dp_i_2+nums[i]);
            dp_i_2 = dp_i_1;
            dp_i_1 = dp_i;
        }
        return dp_i;
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n == 0) return 0;
        if(n == 1) return nums[0];
        return max(robRange(nums, 0, n-2), robRange(nums, 1, n-1));
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章