给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:
你挑选 任意 一块披萨。
Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。
Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。
重复上述过程直到没有披萨剩下。
每一块披萨的大小按顺时针方向由循环数组 slices 表示。
请你返回你可以获得的披萨大小总和的最大值。
输入:slices = [8,9,8,6,1,1]
输出:16
解释:两轮都选大小为 8 的披萨。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。
#include <iostream> #include <vector> using namespace std; class Solution { public: int maxSizeSlices(vector<int> &slices) { if (slices.size() == 0) return 0; vector<int> nums1(slices.begin(), slices.end() - 1); vector<int> nums2(slices.begin() + 1, slices.end()); return max(rob(nums1), rob(nums2)); } int rob(vector<int> &nums) { int n = nums.size(); if (n == 0) return 0; if (n == 1) return nums.front(); int l = (n + 1) / 3; vector<vector<int>> dp(n, vector<int>(l + 1)); dp[0][1] = nums[0]; dp[1][1] = max(nums[0], nums[1]); for (int i = 2; i < n; ++i) { for (int j = 1; j <= l; ++j) { dp[i][j] = max(dp[i - 2][j - 1] + nums[i], dp[i - 1][j]); } } return dp[n - 1][l]; } }; int main() { Solution s; vector<int> nums{1, 2, 3, 4, 5, 6}; cout << s.maxSizeSlices(nums) << endl; }