思路
看题目要么从左取要么从右取,第一时间想到DFS。
因为每个玩家都要用最优策略,所以两者都要计算当前情况下所能取到的最优。
这样会有很多重复计算,为了增加效率,我们把计算过的内部最优结果存起来。
补充说明
- DPS计算当前情况下,当前玩家能取得的最优差值结果。
- 之前的操作对剩余部分的最优结果没有任何影响,所以可以存到Hash里。(所以好像可以用这个规则写DP?)
代码
class Solution {
private HashMap<Integer, Integer> vis;
public boolean predictTheWinner(int[] nums) {
vis = new HashMap<>();
int res = dps(nums, 0, nums.length - 1, true, 0);
return res >= 0;
}
private int dps(int[] nums, int l, int r, boolean first, int flag) {
if (l == r) {
return first ? nums[l] : -nums[l];
}
int left, right;
int lFlag = flag + (1 << l), rFlag = flag + (1 << r);
if (vis.containsKey(lFlag)) {
left = vis.get(lFlag);
} else {
left = dps(nums, l + 1, r, !first, lFlag);
vis.put(lFlag, left);
}
left += (first ? nums[l] : -nums[l]);
if (vis.containsKey(rFlag)) {
right = vis.get(rFlag);
} else {
right = dps(nums, l, r - 1, !first, rFlag);
vis.put(rFlag, right);
}
right += (first ? nums[r] : -nums[r]);
return first ? Math.max(left, right) : -Math.max(-left, -right);
}
}