3n 块披萨

给你一个披萨,它由 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;
}

 

上一篇:SpringMVC的标签库


下一篇:Vue删除数据成功后如何刷新表格数据