leetcode198 打家劫舍
第一次用自己的小脑瓜写出了工地动态规划,虽然效率一般,但是至少是写出来了,每一天有两个状态,一个是今天偷,一个是今天不偷,如果今天没偷,那今天的最大收益就是昨天两种状态的最大值,如果今天偷了,那昨天肯定不能偷,所以今天收益就是昨天没偷的收益加上今天偷到的。贴代码
class Solution { public: int rob(vector<int>& nums) { if(nums.size() == 0) return 0; else if(nums.size() == 1) return nums[0]; vector<vector<int>> good(nums.size(),vector<int>(2)); good[0][0] = 0; good[0][1] = nums[0]; for(int i = 1 ; i < nums.size() ; i++) { good[i][0] = max(good[i-1][0],good[i-1][1]); good[i][1] = good[i-1][0]+nums[i]; } return max(good[nums.size()-1][0],good[nums.size()-1][1]); };
还有一种高级动态规划,只维护与更新两个变量,分别是以当前节点前两个节点为结尾的局部最大值,而遍历这个节点时,就将second的值更新为first+本身节点值与原始second值的较大值,而first更新为原始的second值。贴代码
1 class Solution { 2 public: 3 int rob(vector<int>& nums) 4 { 5 if(!nums.size()) 6 return 0; 7 int n = nums.size(); 8 if(n == 1) 9 return nums[0]; 10 int first = nums[0]; 11 int second = max(first,nums[1]); 12 for(int i = 2 ; i < n ; i++) 13 { 14 int secTemp = second; 15 second = max(first+nums[i],second); 16 first = secTemp; 17 } 18 return second; 19 } 20 };

浙公网安备 33010602011771号