zoukankan      html  css  js  c++  java
  • House Robber

    题目的意思很简单,就是每次只能取非连续的两个值

    用分治法在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 };

    这里最优子结构是用一个二维数组来表示的,可见动态规划算法并不局限于用一维数组来表示最优子结构关系.

    Yosoro
  • 相关阅读:
    Badboy录制脚本时,提示脚本错误解决方法
    Python数据类型_列表
    Wannafly Primary School Students训练记录
    Deadline队伍训练实录
    2018 German Collegiate Programming Contest (GCPC 18)
    2016ccpc杭州
    2016 ICPC 大连
    2017CCPC Final (哈尔滨)
    2017CCPC 长春
    2017 CCPC 杭州
  • 原文地址:https://www.cnblogs.com/tclan126/p/7930365.html
Copyright © 2011-2022 走看看