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

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

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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;
    }
}
相关推荐
To_OC3 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC3 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK5 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境17 小时前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境18 小时前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
To_OC1 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC1 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
郝学胜_神的一滴2 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
To_OC2 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
卷无止境4 天前
C++ 的Eigen 库全解析
c++