198.House Robber

 

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int rob(vector<int>& nums) {
    if (nums.size() == 0) return 0;
    if (nums.size() == 1) return nums[0];
    if (nums.size() == 2) return max(nums[0], nums[1]);
    int len = nums.size();
    vector<int> nums_tmp1(nums.begin(),nums.begin() + len-1);
    vector<int> nums_tmp2(nums.begin(),nums.begin() + len-2);
    return max(nums[len-1] + rob(nums_tmp2), rob(nums_tmp1));
}

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int rob(vector<int>& nums) {
    int len = nums.size();
    if (len == 0) return 0;
    if (len == 1)return nums[0];
    int* ans;
    ans = new int[len];
    ans[0] = nums[0];
    ans[1] = max(nums[0], nums[1]);
    for (int i = 2; i < len; i++) {
        ans[i] = max(nums[i] + ans[i - 2], ans[i - 1]);
    }
    return ans[len-1];
    delete []ans;
}

int main() {
    vector<int> a = { 2,7,9,3,1 };
    cout << rob(a) << endl;
    return 0;
}

 

Java 版:

思路:

  • 动态规划问题,不能使用相邻的两个数,即,分为:
  • 如果要使用当前的数字,则 : Sum = nums[i-2] + nms[i];
  • 如果不使用当前的数字,则:Sum = nums[i-1];
  • 比较这两个数字,哪一个更大。

 

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 0) return 0;
        int n = nums.length;
        if(n == 1) return nums[0];
        nums[1] = Math.max(nums[1], nums[0]);
        for(int i = 2; i < n; i++){
            nums[i] = Math.max(nums[i-2] + nums[i], nums[i-1]);//状态转移方程
        }
        return nums[n-1];
    }
}

 

posted @ 2020-05-10 22:43  星海寻梦233  阅读(125)  评论(0编辑  收藏  举报