打家劫舍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】

浙公网安备 33010602011771号