#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]; } }