博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LintCode Coins in a Line III
阅读量:4947 次
发布时间:2019-06-11

本文共 2237 字,大约阅读时间需要 7 分钟。

原题链接在这里:

题目:

There are n coins in a line. Two players take turns to take a coin from one of the ends of the line until there are no more coins left. The player with the larger amount of money wins.

Could you please decide the first player will win or lose?

Example

Given array A = [3,2,2], return true.

Given array A = [1,2,4], return true.

Given array A = [1,20,4], return false.

题解:

类似.

DP问题. 状态dp[l][r]第i到第j的硬币时,先手去硬币的人最后最多去硬币价值.

转移方程, pickLeft = min(dp[l+2][r], dp[l+1][r-1])+values[l]

     pickRight = min(dp[l][r-2], dp[l-1][r-1])+values[r]

     dp[l][r] = max(pickLeft, pickRight)

初始化l == r时, dp[l][r] = values[l]

        l+1 == r时, dp[l][r] = max(values[l], values[l+1])

答案dp[0][values.length-1] > sum/2

Time Complexity: O(n^2), 有n^2个状态需要去计算. Space: O(n^2).

AC Java:

1 public class Solution { 2     /** 3      * @param values: an array of integers 4      * @return: a boolean which equals to true if the first player will win 5      */ 6     public boolean firstWillWin(int[] values) { 7         if(values == null || values.length == 0){ 8             return false; 9         }10         11         int n = values.length;12         int [][] dp = new int[n][n];13         boolean [][] used = new boolean[n][n];14         int sum = 0;15         for(int val : values){16             sum += val;17         }18         return sum < 2*memorySearch(values, 0, values.length-1, dp, used);19     }20     21     private int memorySearch(int [] values, int l, int r, int [][] dp, boolean [][] used){22         if(used[l][r]){23             return dp[l][r];24         }25         used[l][r] = true;26         if(l>r){27             dp[l][r] = 0;28         }else if(l == r){29             dp[l][r] = values[l];30         }else if(l + 1 == r){31             dp[l][r] = Math.max(values[l], values[l+1]);32         }else{33             int pickLeft = Math.min(memorySearch(values, l+2, r, dp, used), memorySearch(values, l+1, r-1, dp, used)) + values[l];34             int pickRight = Math.min(memorySearch(values, l+1, r-1, dp, used), memorySearch(values, l, r-2, dp, used)) + values[r];35             dp[l][r] = Math.max(pickLeft, pickRight);36         }37         return dp[l][r];38     }39 }

 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/6410366.html

你可能感兴趣的文章
eclispe启动进入子项目的解决
查看>>
C++解析(1):C到C++的升级
查看>>
洛谷P4841 城市规划(多项式求逆)
查看>>
JS随笔2
查看>>
用Filter程序实现静态HTML页面的访问保护
查看>>
uoj6
查看>>
Linux NFS服务器的安装与配置
查看>>
01小偷银行
查看>>
备用交换机_cogs8_割点
查看>>
mysql-ubuntu14.04彻底卸载mysql
查看>>
FSL安装
查看>>
如何查看与刷新DNS本地缓存
查看>>
JDBC的初步了解及使用
查看>>
ASP.NET 2.0 Membership以及Single Sign On的几个资源
查看>>
没有完成的题目
查看>>
linux文件权限问题
查看>>
自我介绍
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
在程序被送入后台时,向 iOS 借点时间,来完成一个长期任务
查看>>