思路如下:(毕竟是动态规划,那我们就按照动态规划的三步来走)
2.1 如果这里只有两堆石子[3,5],我们怎么保证亚历克斯的dp[0][1]最优值? 如果亚历克斯一开始拿走的是piles[0]=3,此时李变成了先手,那么状态是不是变成了要找李的dp[1][1],(亚历克斯的最优选取策略就变成了李的最优选取策略)即dp[i+1][j]表示对手比当前的选手多出来的石子数量,那么此时亚历克斯比李多的石子数量就是“piles[0] – dp[1][1]”;同理,如果亚历克斯一开始拿走的是piles[1],那么此时李变成了先手,那么亚历克斯比李多的石子数量就是“piles[1] – dp[0][0]”,我们选取两者之间的最大值就好了。
2.2 如果此时是三堆石子[3,5,1],我们可以同样这样思考,如果亚历克斯一开始拿走的是piles[0],那么是不是此时就该比较“piles[0] – dp[1][2]”;同理,如果亚历克斯一开始拿走的是piles[2],那么此时李变成了先手,那么亚历克斯比李多的石子数量就是“piles[2] – dp[0][1]”。
3.3 以此类推,到n堆石子的时候,我们判断max(piles[0] – dp[1][n-1],piles[n-1] – dp[0][n-2])即可;class Solution { public boolean stoneGame(int[] piles) { int n = piles.length; int[][] dp = new int[n][n]; for(int i=0;i<n;i++){ dp[i][i] = piles[i]; } for(int len=1;len<n;len++){ for(int i=0;i<n-len;i++){ int j = i + len; dp[i][j] = Math.max(piles[i] - dp[i+1][j],piles[j] - dp[i][j-1]); } } return dp[0][n-1] > 0; } }
class Solution { public boolean stoneGame(int[] piles) { int n = piles.length; int[] dp = new int[n]; for(int i=0;i<n;i++){ dp[i] = piles[i]; } for(int len=1;len<n;len++){ for(int i=0;i<n-len;i++){ int j = i + len; dp[i] = Math.max(piles[i] - dp[i+1],piles[j] - dp[j-1]); } } return dp[n-1] > 0; } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
官方软件产品操作指南 (170)