谁都没有想到,谁都没有想到!在8月份LeetCode每日签到中出现了两块披萨的题目,一次比一次难今天这到题目更是给我整破防了😅
首先在1444.切披萨的方案数中,你把披萨放上苹果是什么黑暗料理,OK直接暴力破解,一看不行52/54,OKOK行
最后参考灵茶山大佬的思路 通过动态规划+递归解决,解决思路给个链接。
详情可以参考:
作者:灵茶山艾府
链接:力扣(LeetCode)
链接:力扣(LeetCode)
( ¬、¬)
重量级的来了
第二天出现了1388 3n块披萨
题目如下:
给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:
你挑选 任意 一块披萨。
Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。
Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。
重复上述过程直到没有披萨剩下。
每一块披萨的大小按顺时针方向由循环数组 slices 表示。
( ¬、¬)
请你返回你可以获得的披萨大小总和的最大值。
( ¬、¬)
输入:slices = [1,2,3,4,5,6]
输出:10
解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选大小为 3 和 5 的披萨。然后你选择大小为 6 的披萨,Alice 和 Bob 分别挑选大小为 2 和 1 的披萨。你获得的披萨总大小为 4 + 6 = 10 。
( ¬、¬)
输入:slices = [8,9,8,6,1,1]
输出:16
解释:两轮都选大小为 8 的披萨。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。
( ¬、¬)
给出的提示是
1 <= slices.length <= 500
slices.length % 3 == 0
1 <= slices[i] <= 1000
又是你 又是困难披萨
但是 欸 动态规划!!
( ¬、¬)
思路:在一个3n的环形数组中,选择n个不相邻的数,让这个n个数的和最大
( ¬、¬)
因为对于java语言比较熟练所以使用的java
题解如下:
class Solution {
public int maxSizeSlices(int[] slices) {
return Math.max(maxSizeSlices(slices, 0, slices.length - 2), maxSizeSlices(slices, 1, slices.length - 1));
}
public int maxSizeSlices(int[] slices, int start, int end) {
int m = end - start + 1;
int pick = (m + 1) / 3;
int[][] dp = new int[m + 1][pick + 1];
for (int i = 1; i <= m; i++) {
int size = slices[start + i - 1];
for (int j = 1; j <= pick; j++) {
int prevSize = i > 1 ? dp[i - 2][j - 1] : 0;
dp[i][j] = Math.max(prevSize + size, dp[i - 1][j]);
}
}
return dp[m][pick];
}
}
相关的动态规划题目解决问题:213 打家劫舍 ( ¬、¬)
然后也可以用双链表+后悔贪心算法+最大堆也可做出来,而且这种方法更好,但是我做不出来... 哈哈。最后困难题真的折磨😣
时隔三个月,大佬发言!!!