2023-08-18每日一题
一、题目编号
1388. 3n 块披萨
二、题目链接
三、题目描述
给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:
你挑选 任意 一块披萨。
Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。
Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。
重复上述过程直到没有披萨剩下。
每一块披萨的大小按顺时针方向由循环数组 slices 表示。
请你返回你可以获得的披萨大小总和的最大值。
四、解题代码
cpp
class Solution {
public:
int calculate(const vector<int>& slices) {
int N = slices.size(), n = (N + 1) / 3;
vector<vector<int>> dp(N, vector<int>(n + 1, INT_MIN));
dp[0][0] = 0;
dp[0][1] = slices[0];
dp[1][0] = 0;
dp[1][1] = max(slices[0], slices[1]);
for (int i = 2; i < N; i++) {
dp[i][0] = 0;
for (int j = 1; j <= n; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i - 2][j - 1] + slices[i]);
}
}
return dp[N - 1][n];
}
int maxSizeSlices(vector<int>& slices) {
vector<int> v1(slices.begin() + 1, slices.end());
vector<int> v2(slices.begin(), slices.end() - 1);
int ans1 = calculate(v1);
int ans2 = calculate(v2);
return max(ans1, ans2);
}
};