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

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

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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;
    }
}
相关推荐
handler015 分钟前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
t***5441 小时前
如何在Dev-C++中使用Clang编译器
开发语言·c++
Qbw20041 小时前
【Linux】进程地址空间
linux·c++
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香3 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut3 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
Kurisu_红莉栖4 小时前
c++复习——const,static字
c++
czxyvX4 小时前
1-Qt概述
c++·qt
齐鲁大虾4 小时前
新人编程语言选择指南
javascript·c++·python·c#
CoderMeijun4 小时前
C++ 多线程进阶:Lambda、条件变量与死锁
c++·多线程·条件变量·lambda·死锁·生产者消费者