汕头市建筑信息网站,爬虫网站开发,电脑网页视频怎么下载,wordpress 老板页题目
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行#xff0c;每堆都有正整数颗石子 piles[i] 。
游戏以谁手中的石子最多来决出胜负。石子的总数是奇数#xff0c;所以没有平局。
亚历克斯和李轮流进行#xff0c;亚历克斯先开始。 每回合#xff0c;玩家从行的…题目
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行每堆都有正整数颗石子 piles[i] 。
游戏以谁手中的石子最多来决出胜负。石子的总数是奇数所以没有平局。
亚历克斯和李轮流进行亚历克斯先开始。 每回合玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止此时手中石子最多的玩家获胜。
假设亚历克斯和李都发挥出最佳水平当亚历克斯赢得比赛时返回 true 当李赢得比赛时返回 false 。 示例
输入[5,3,4,5] 输出true 解释 亚历克斯先开始只能拿前 5 颗或后 5 颗石子 。 假设他取了前 5 颗这一行就变成了 [3,4,5] 。 如果李拿走前 3 颗那么剩下的是 [4,5]亚历克斯拿走后 5 颗赢得 10 分。 如果李拿走后 5 颗那么剩下的是 [3,4]亚历克斯拿走后 4 颗赢得 9 分。 这表明取前 5 颗石子对亚历克斯来说是一个胜利的举动所以我们返回 true 。
提示
2 piles.length 500piles.length 是偶数。1 piles[i] 500sum(piles) 是奇数。
解题思路
数组定义
dp[i][j]表示对于子数组[i…j]先手与后手玩家之间得分的差
状态转移
对于dp[i][j]假设先手玩家为a后手为b
a玩家先拿的是piles[i]那么取走piles[i]了以后b玩家与a玩家得分的差距就是dp[i1][j]a玩家先拿的是piles[j]那么取走piles[j]了以后b玩家与a玩家得分的差距就是dp[i][j-1] 选择得分更大的情况
代码
class Solution {public boolean stoneGame(int[] piles) {int npiles.length;int[][] dp new int[n][n];for (int i 0; i n; i) {dp[i][i]piles[i];}for (int in-2;i0;i--){for (int ji1;jn;j)dp[i][j] Math.max(piles[i]-dp[i1][j],piles[j]-dp[i][j-1]);}return dp[0][n-1]0;}
}