力扣原题《打家劫舍》递归版动态规划,纯手搓,已验证,未优化

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:

输入:[1,2,3,1]

输出:4

解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入:[2,7,9,3,1]

输出:12

解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示:

1 <= nums.length <= 100

0 <= nums[i] <= 400

我的答案

cpp 复制代码
class Rob {
public:
    int rob(vector<int>& nums) {
        //找出所有路径,取最大一条
        int maxGet = 0;
        for (int i = 0; i < nums.size(); i++)
        {
            vector<int> temp(nums.begin(), nums.end());
            int sum = temp[i];//任一点出发
            if (temp.size() >= 1) 
            {
                if (temp.size() == 1) 
                    temp.erase(temp.begin());
                else if (i + 1 >= temp.size())
                {
                    if (i + 1 > temp.size()) 
                        temp.erase(temp.begin(), temp.begin() + i);
                    else 
                        temp.erase(temp.begin(), temp.end());
                }
                else 
                    temp.erase(temp.begin(), temp.begin() + i + 2);
            }
            if (temp.size() >1) 
                sum += rob(temp);
            else if(temp.size() == 1)
                sum += rob(temp);
            if (sum > maxGet) 
                maxGet = sum;
        }
        return maxGet;
    }
};
int main()
{
    vector<vector<int>> nums;
    nums.push_back({ 2,1,1,2 });//4
    nums.push_back({1,2,3,1});//4
    nums.push_back({ 2,7,9,3,1 });//12
    nums.push_back({ 2,3,2 });//4
    nums.push_back({ 1,2,3,1 }); //4
    nums.push_back({ 1,2 });//2
    nums.push_back({ 1,2 ,2,1});//3
    nums.push_back({ 2,4 ,8,9,9,3 });//19
    nums.push_back({ 1,9,9 });//10
    nums.push_back({ 8,2,8,9,2 }); //18
    nums.push_back({ 1,2,1,1 });//3
    nums.push_back({ 6,3,10,8,2,10,3,5,10,5,3 });//39
    Rob rob;
    for (vector<vector<int>>::iterator iter = nums.begin(); iter != nums.end(); iter++)
    {
        std::cout << "收集最多金额为:" << rob.rob(*iter) << std::endl<<std::endl;
    }
}
相关推荐
Byron Loong5 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
坚果派·白晓明5 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
咩咦6 小时前
C++学习笔记02:cin 和 cout 输入输出
c++·学习笔记·cin·输入输出·cout
咩咦6 小时前
C++学习笔记05:引用和常引用
c++·学习笔记·引用·const·常引用
香蕉鼠片6 小时前
算法过程中不会的
开发语言·c++
阿旭超级学得完6 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野6 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
磊 子7 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练之字符串 --【回文字符串】:回文拼接
c++·字符串·csp·高频考点·信奥赛·字符串回文·回文拼接
Teleger9 小时前
在window上使用c++控制鼠标点击,实现的exe
c++·单片机·计算机外设