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

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

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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;
    }
}
相关推荐
王燕龙(大卫)6 小时前
fastdds笔记
网络·c++·笔记
脱胎换骨-军哥6 小时前
C++ 与 Go 生成质量比拼,谁是分布式主力语言
c++·分布式·golang
快乐星空Maker6 小时前
C++【生存游戏】开发:荒岛往事 第三期
开发语言·c++·游戏·编程语言
郝学胜-神的一滴6 小时前
Qt 高级编程 035:无边框窗口阴影以及圆角双特效实现
开发语言·c++·qt·程序人生·用户界面
AA陈超6 小时前
006 T03 — 蓝图操作指南
c++·游戏·架构·ue5·github·虚幻引擎
小保CPP6 小时前
OCR C++ Tesseract从OpenCV中获取图片
c++·人工智能·opencv·ocr·模式识别·光学字符识别
Tisfy7 小时前
LeetCode 1979.找出数组的最大公约数:模拟(附手动gcd)
java·数学·算法·leetcode·题解·最大公约数
CHANG_THE_WORLD7 小时前
7.C++标准多线程实现 TCP通信
java·c++·tcp/ip
江屿风7 小时前
【C++笔记】List流食般投喂
开发语言·c++·笔记·list
To_OC7 小时前
LC 79 单词搜索:都说这是回溯入门题,我却连错三回
javascript·算法·leetcode