新农上路
- 积分
- 95
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-8-26
- 最后登录
- 1970-1-1
|
你考虑的这个跟我想法一样, 所以我对上面的解法有一些疑问.
我觉得如果轮到B取的时候, 如果coin[i] == coin[j], 此时我们不能默认B就取 i 或 j (上面的解法把== 归到了> or < 的情况, 我觉得是不对的), 而是我们应该假定B取得结果使得A剩余的能取得的最大值最小.
个人解法:- public static int takeMost(int[] coins){
- int n = coins.length;
- int[][] dp = new int[n+2][n+2];
- for(int j=0; j<n; j++){
- for(int i=j; i>=0; i--){
- if(i >= j-1){
- dp[i][j] = Math.max(coins[i], coins[j]);
- } else{ // <---- i <= j - 2
- // A takes coins[i]
- int opt1 = coins[i];
- if(coins[i+1] > coins[j]){
- opt1 += dp[i+2][j];
- } else if (coins[i+1] < coins[j]){
- opt1 += dp[i+1][j-1];
- } else{
- opt1 += Math.min(dp[i+2][j], dp[i+1][j-1]);
- }
- // A takes coins[j]
- int opt2 = coins[j];
- if(coins[i] > coins[j-1]){
- opt2 += dp[i+1][j-1];
- } else if(coins[i] < coins[j-1]){
- opt2 += dp[i][j-2];
- } else {
- opt2 += Math.min(dp[i][j-2], dp[i+1][j-1]);
- }
- dp[i][j] = Math.max(opt1, opt2);
- }
- }
- }
- return dp[0][n-1];
- }
复制代码 |
|