打家劫舍II

原题在这里

  概述题意:给定数组中,求不相邻最大取值和(首尾也相邻)

我动态规划真的不太行

写了个dfs,TLE

复制代码
class Solution
{
    vector<int> num, vis;
    int n, ans;
    void dfs(int x, int y) //下标为x
    {
        if (vis[(x - 1 + n) % n] || vis[(x + 1) % n]) //必须左邻和右邻未访问
            return;
        vis[x] = 1;
        cout << "考虑=" << y << endl;
        ans = max(ans, y);
        for (int i = x + 2; i < n; ++i)
            if (!vis[i])
                dfs(i, y + num[i]);
        vis[x] = 0;
    }

public:
    int rob(vector<int> &nums)
    {
        num = nums, n = nums.size();
        vis = vector<int>(n, 0);
        dfs(0, num[0]);
        if (n > 1)
            dfs(1, num[1]);
        if (n > 2)
            dfs(2, num[2]);
        return ans;
    }
};
不建议看
复制代码

还得是动态规划才行:

我都想到了分两段[0,size-1]和[1,size]去遍历,但是就是想不到转移方程,瞎写

复制代码
class Solution
{
    vector<int> num;
    int range(int l, int r)
    {
        int x = 0, y = 0;//当前i和前置i
        for (int i = l; i < r; ++i)
        {
            int z = x;//计算i, 预存pre
            x = max(num[i] + y, z);
            y = z;
        }
        return x;
    }

public:
    int rob(vector<int> &nums)
    {
        if (nums.size() == 1)
            return nums[0];
        num=nums;
        return max(range(0, nums.size() - 1), range(1, nums.size()));
    }
};
复制代码

 

 

【Over】

posted @   Renhr  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示