打家劫舍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 @ 2022-03-31 10:36  Renhr  阅读(20)  评论(0)    收藏  举报