分披萨问题概述
华为OD机试中的分披萨问题是一个典型的动态规划与贪心算法结合的题目。题目描述为:有n个人围坐一圈分披萨,每次可以选择当前人拿走披萨或跳过,拿披萨的人会获得相应分数,但相邻的人不能再拿披萨。目标是最大化总分数。
问题分析
该问题可以转化为环形数组的非相邻元素最大和问题。由于是环形,首尾元素不能同时选取。解决思路是拆分为两个子问题:
- 不选第一个元素,对剩余部分求解。
- 不选最后一个元素,对剩余部分求解。
最终结果为这两个子问题的最大值。
贪心与DFS结合解法
贪心算法通常用于局部最优选择,但在此问题中无法保证全局最优。DFS可以枚举所有可能,但时间复杂度高。结合贪心的剪枝策略可以优化DFS效率。
动态规划解法
动态规划是更优解。定义dp[i]为前i个元素的最大和,递推关系为:
dp[i] = max(dp[i-1], dp[i-2] + nums[i])
对于环形问题,需要两次动态规划:
- 排除第一个元素。
- 排除最后一个元素。
代码示例
Java实现
public class PizzaSharing {
public int maxPizza(int[] nums) {
if (nums.length == 1) return nums[0];
return Math.max(helper(nums, 0, nums.length - 2),
helper(nums, 1, nums.length - 1));
}
private int helper(int[] nums, int start, int end) {
int prev2 = 0, prev1 = nums[start];
for (int i = start + 1
### 分披萨问题概述
华为OD机试中的分披萨问题是一个典型的动态规划与贪心算法结合的题目。题目描述为:有n个人围坐一圈分披萨,每次可以选择当前人拿走披萨或跳过,拿披萨的人会获得相应分数,但相邻的人不能再拿披萨。目标是最大化总分数。
### 问题分析
该问题可以转化为环形数组的非相邻元素最大和问题。由于是环形,首尾元素不能同时选取。解决思路是拆分为两个子问题:
1. 不选第一个元素,对剩余部分求解。
2. 不选最后一个元素,对剩余部分求解。
最终结果为这两个子问题的最大值。
### 贪心与DFS结合解法
贪心算法通常用于局部最优选择,但在此问题中无法保证全局最优。DFS可以枚举所有可能,但时间复杂度高。结合贪心的剪枝策略可以优化DFS效率。
#### 动态规划解法
动态规划是更优解。定义`dp[i]`为前i个元素的最大和,递推关系为:
- `dp[i] = max(dp[i-1], dp[i-2] + nums[i])`
对于环形问题,需要两次动态规划:
1. 排除第一个元素。
2. 排除最后一个元素。
### 代码示例
#### Java实现
```java
public class PizzaSharing {
public int maxPizza(int[] nums) {
if (nums.length == 1) return nums[0];
return Math.max(helper(nums, 0, nums.length - 2),
helper(nums, 1, nums.length - 1));
}
private int helper(int[] nums, int start, int end) {
int prev2 = 0, prev1 = nums[start];
for (int i = start + 1

被折叠的 条评论
为什么被折叠?



