硬币排成线I和硬币排成线II问题

来源:互联网 发布:知满天教育官网 编辑:程序博客网 时间:2024/05/22 17:11

有 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);}}






原创粉丝点击