https://leetcode.com/problems/can-i-win/
本题是一道比较巧妙的DP问题,用HashMap保存状态。一个玩家当前能否获胜取决于两点:1、当前剩余还能获取的元素;2、当前剩余的desired(剩余目标和)
由于max范围在20以内,因此当前剩余元素的表示按位来做,map存的值就是在当前剩余元素的状态下获胜还是失败。
要注意,一个玩家取了一个值之后再调用helper,如果得到false,说明下一个玩家必败态,故而当前玩家必胜态。
public class Solution {
HashMap<Integer, Boolean> map = new HashMap<>();
boolean[] dp;
public boolean canIWin(int max, int desired) {
int sum = (1 + max) * max / 2;
if (sum < desired) return false;
if (desired <= 0) return true;
dp = new boolean[max];
return helper(desired);
}
private boolean helper(int desired) {
if (desired <= 0) return