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

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

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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 <= numsi <= 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;
    }
}
相关推荐
码匠许师傅5 小时前
【C++三方组件】toml++:人性化的配置文件格式
c++
骑着蜗牛撵大象3276 小时前
告别内存泄漏:LLMManager架构设计与智能指针在AI SDK中的智慧选型
c++·ai·架构
Navigator_Z6 小时前
LeetCode //C - 1254. Number of Closed Islands
c语言·算法·leetcode
汉克老师7 小时前
CSP-J 2026 初赛试题解析(第二部分:阅读程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
syagain_zsx7 小时前
算法基础篇 · 04 前缀和(C++ 题解)
c++·算法·前缀和
汉克老师8 小时前
CSP-J 2026 初赛试题解析(第三部分:完善程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
haluhalu.9 小时前
初识 Protobuf:微服务跨语言通信的一份契约
java·c语言·开发语言·c++·python
longxuan019 小时前
倍增算法详解
c++·st表·倍增算法
-森屿安年-9 小时前
返回最大数
c++·贪心算法