预测赢家
给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。
我看到的最优解的代码没有看懂,求和应该可以优化一下
代码链接
class Solution
{
public:
int dp[21][21];
int sum(const vector<int> &nums, int L, int R)
{
int sum = 0;
for(int i = L; i <= R; i++)
{
sum += nums[i-1];
}
return sum;
}
int dfs(int L, int R, const vector<int> &nums)
{
if(dp[L][R] != -1)
{
return dp[L][R];
}
if(L == R)
{
return dp[L][R] = nums[L-1];
}
return dp[L][R] = sum(nums, L, R) - min(dfs(L+1, R, nums), dfs(L, R-1, nums));
}
bool PredictTheWinner(vector<int>& nums)
{
memset(dp, -1, sizeof(dp));
return dfs(1, nums.size(), nums)*2 >= sum(nums, 1, nums.size());
}
};