1. 程式人生 > >【計蒜客】取數遊戲

【計蒜客】取數遊戲

有如下一個雙人遊戲: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]));
		
		
	}

}