题目的意思很简单,就是每次只能取非连续的两个值
用分治法在nums比较大时会超时
1 class Solution { 2 public: 3 int rob(vector<int>& nums) { 4 return robber(nums.size(),nums); 5 } 6 int robber(int n,vector<int> nums){ 7 if(n<=0) return 0; 8 return max(nums[n-1]+robber(n-2,nums),robber(n-1,nums)); 9 } 10 };
仔细思考一下发现有重复子问题,设v中存着最优的解,则最优解为 max(v[n][0],v[n][1]),v[n][0]表示不取第n个数时的最优解,v[n][1]表示取第n个数时的最优解,同时满足最优子结构性质,如下所示
v[n][0]=max(v[n-1][0],v[n-1][1]); 不取n时的最优解为取n-1时的最优解和不取n-1时的最优解的较大者
v[n][1]=v[n-1][0]+nums[n]; 取n时的最优解,只能从不取n-1的最优解中得到
所以可改为动态规划算法
1 class Solution { 2 public: 3 int rob(vector<int>& nums) { 4 if(nums.size()==0) return 0; 5 vector<vector<int>> v(nums.size(),vector<int>(2)); 6 for(int i=0;i<nums.size();i++) { 7 if(i==0) { 8 v[0][0]=0; 9 v[0][1]=nums[0]; 10 continue; 11 } 12 v[i][0]=max(v[i-1][0],v[i-1][1]); 13 v[i][1]=v[i-1][0]+nums[i]; 14 } 15 return max(v[nums.size()-1][0],v[nums.size()-1][1]); 16 } 17 };
这里最优子结构是用一个二维数组来表示的,可见动态规划算法并不局限于用一维数组来表示最优子结构关系.