【計蒜客】取數遊戲
阿新 • • 發佈:2019-01-02
有如下一個雙人遊戲:N個正整數的序列放在一個遊戲平臺上,兩人輪流從序列的兩端取數,每次有數字被一個玩家取走後,這個數字被從序列中去掉並累加到取走該數的玩家的得分中,當數取盡時,遊戲結束。以最終得分多者為勝。
編一個執行最優策略的程式,最優策略就是使自己能得到在當前情況下最大的可能的總分的策略。你的程式要始終為兩位玩家執行最優策略。
輸入第1行包括一個正整數N(2≤N≤100), 表示序列中正整數的個數。輸入第2行包含用空格分隔的N個正整數(1≤所有正整數≤200)。
只有一行,用空格分隔的兩個整數: 依次為先取數玩家和後取數玩家的最終得分。
樣例輸入
6 4 7 2 9 5 2
樣例輸出
18 11
大神思路:
獲得gain[i][j](獲得到j最大的取值方法),
在只有兩個數字的時候,有兩種取值方法
取第一個數字gain[i+1][j]
取第二個數字gain[i][j-1]
選一個最大的獲取。
是一個自底向上的動態規劃解決方法
gain[i][j]=sum[j]-sum[i-1]-Math.min(gain[i+1][j], gain[i][j-1]);
public class Test4 { public static void main(String args[]){ Test4 test=new Test4(); test.start(); } public void start(){ Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int array[]=new int[n+1]; int sum[]=new int[n+1]; int gain[][]=new int[n+1][n+1]; for(int i=1;i<=n;i++){ array[i]=scan.nextInt(); sum[i]+=sum[i-1]+array[i]; gain[i][i]=array[i]; } for(int i=n-1;i<array.length&&i>0;i--){ for(int j=i;j<array.length;j++){ gain[i][j]=sum[j]-sum[i-1]-Math.min(gain[i+1][j], gain[i][j-1]); } } System.out.println(gain[1][n]+" "+(sum[n]-gain[1][n])); } }