• leetcode(c++)(打家劫舍)


    #include <iostream>
    #include <vector>
    #include <unordered_map>
    using namespace std;
    
    int rob(const vector<int>& nums)
    {
        if(nums.empty())return 0;
        int n = nums.size();
        if(n == 1)return nums[0];   
        vector<int>dp(n+1);
        dp[0] = 0;
        dp[1] = nums[0];
        for(int i = 2; i < n+1; ++i)
        {
            dp[i] = max(dp[i-2] + nums[i-1],dp[i-1]);
        }
        return dp[n];
    }
    
    int rob1(const vector<int>& nums)
    {
        if(nums.empty())return 0;
        int n = nums.size();
        vector<int>nums1,nums2;
        for(int i = 1; i < n;++i)
        {
            nums1.push_back(nums[i]);
        }
        for(int i = 0; i < n-1;++i)
        {
            nums2.push_back(nums[i]);
        }
        return max(rob(nums1),rob(nums2));
    }


    struct TreeNode
    {
        int val = 0;
        TreeNode* left = nullptr;
        TreeNode* right = nullptr;
        TreeNode(int val_):val(val_){}
    };
    
    int rob(TreeNode* root)
    {
        unordered_map<TreeNode*,int>map;
        if(nullptr == root)return 0;
        if(map.find(root)!=map.end())return map.at(root);
        int robV = root->val;
        if(root->left != nullptr)robV+=rob(root->left->left) + rob(root->left->right);
        if(root->right != nullptr)robV+=rob(root->right->left) + rob(root->right->right);
        int notRob = rob(root->left)+rob(root->right);
        int res = max(robV,notRob);
        map[root]=res;
        return res;
    }
    
    vector<int>robSub(TreeNode* root)
    {
        if(nullptr == root)return {0,0};
        vector<int>leftV = robSub(root->left);
        vector<int>rightV = robSub(root->right);
        int rob = root->val + leftV[0] + rightV[0];
        int  notRob = max(leftV[0],leftV[1]) + max(rightV[0],rightV[1]);
        return {notRob,rob};
    
    }
    
    int rob1(TreeNode* root)
    {
        if(nullptr == root)return 0;
        vector<int>res = robSub(root);
        return max(res[0],res[1]);
    }
    int main()
    {
        //LeetCode198
        vector<int>houses{1,2,3,1};
        cout << rob(houses) << endl;
    
        //LeetCode213
        vector<int>housesI{7,4,1,9,3,8,6,5};
        cout << rob1(housesI) << endl;
    
    
    
          //LeetCode337
          TreeNode n0(3);
          TreeNode n1(2);
          TreeNode n2(3);
          TreeNode n3(3);
          TreeNode n4(1);
          n0.left = &n1;
          n0.right = &n2;
          n1.right = &n3;
          n2.right = &n4;
          // cout << rob(&n0) << endl;
          cout << rob1(&n0) << endl;
    return 0;
    }
  • 相关阅读:
    DVI与DVI-D的区别
    easyui.combotree.search.js
    显示实时日期时间(html+js)
    Jquery 内容简介
    EasyUI 格式化DataGrid列
    EasyUI DataGrid 添加排序
    EasyUI DataGrid 复选框
    EasyUI 自定义DataGrid分页
    EasyUI DataGrid能编辑
    EasyUI 我的第一个窗口
  • 原文地址:https://www.cnblogs.com/fourmi/p/16194741.html
Copyright © 2020-2023  润新知