有 n
个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。
请判定 第一个玩家 是输还是赢?
样例
n = 1
, 返回 true
.
n = 2
, 返回 true
.
n = 3
, 返回 false
.
n = 4
, 返回 true
.
n = 5
, 返回 true
.
public class Solution {
/**
* @param n: an integer
* @return: a boolean which equals to true if the first player will win
*/
public boolean firstWillWin(int n) {
return n%3!=0;
}
}
有 n
个不同价值的硬币排成一条线。两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 第一个玩家 是输还是赢?
样例
给定数组 A = [1,2,2]
, 返回 true
.
给定数组 A = [1,2,4]
, 返回 false
.
此题与3602公司2017年春招的编程题分金子问题如出一辙;
import java.util.Scanner;
/**
* n 个不同价值的硬币排成一条线。两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 第一个玩家 是输还是赢?
您在真实的面试中是否遇到过这个题? Yes
样例
给定数组 A = [1,2,2], 返回 true.
给定数组 A = [1,2,4], 返回 false.
*
* @author Dell
*
*/
public class Test395 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
int t=0;
for(int i=0;i<a.length;i++)
{
a[i]=sc.nextInt();
t=t+a[i];
}
int[][]dp=new int[a.length+1][a.length+1];
int[] sum=new int[n+1];
for(int i=1;i<a.length+1;i++)
{
dp[i][i]=a[i-1];
sum[i]=sum[i-1]+a[i-1];
}
for(int i=1;i<a.length;i++)
{
dp[i][i+1]=a[i-1]+a[i];
}
for(int i=n-2;i>=1;i--)
{
for(int j=i+2;j<n+1;j++)
{
int x=sum[j]-sum[i-1]-dp[i+1][j];
int y=sum[j]-sum[i-1]-dp[i+2][j];
dp[i][j]=Math.max(x, y);
}
}
int result=t-dp[1][n];
if(dp[1][n]>result)
System.out.println(true);
else
System.out.println(false);
}
}