题目:一个数组,俩人从里面取数,要么从最左边取,要么从最右边取,直至把所有数取完,若第一个人取得所有数之和比第二个人取得数之和大,则为true
输入:一个整型数组
输出:true or false
别人思路:
使用动态规划的思想:设dp[i][j]表示从piles[i]到piles[j]你可以比对手多得的最多的分数。这样我们的最终目标是dp[0][n-1]。
现在我们需要确定转移方程和初始条件。在piles[i]~piles[j]中,你可以选择piles[i]或者piles[j]:
如果你选择了piles[i],那么你的对手就会从piles[i+1]~piles[j]中得到最多的分数,分数差值为piles[i]-dp[i+1][j].(题目要求都发挥最佳水平,所以对于对手而言dp的含义一样。,他会从剩下的piles中选择最多的分数,所以两者做减法。)
如果你选择了piles[j],分数差值为piles[j] - dp[i][j-1].
所以状态转移方程为:
dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1])
class solution{
public boolean stoneGame(int[] piles) {
int dp[][] = new int[piles.length][piles.length] ;
for(int i=0;i<piles.length;i++){
dp[i][i] = piles[i] ;
}
for(int j=1;j<piles.length;j++){
for(int i=0;i<piles.length-j;i++){
dp[i][i+j] = Math.max(piles[i] - dp[i+1][i+j], piles[i+j] - dp[i][i+j-1]) ;
}
}
return dp[0][dp.length-1] > 0 ;
}
}