게임 이론 의 2 인 취 수 게임 에 대한 상세 한 설명

1973 단어 알고리즘
묘사 하 다.
다음 과 같은 2 인용 게임 이 있 습 니 다. N (2 < = N < = 100) 개의 정수 서열 은 한 게임 플랫폼 에 놓 여 있 습 니 다. 게임 은 게이머 1 부터 시작 합 니 다. 두 사람 은 돌아 가면 서 서열 의 양 끝 에서 수 를 뽑 습 니 다. 수 를 뽑 은 후에 이 숫자 는 제거 되 고 본 게이머 의 득점 에 누적 되 었 습 니 다. 수 를 다 뽑 았 을 때 게임 은 묶 입 니 다.최종 득점 다 자로 이기다.
가장 좋 은 전략 을 실행 하 는 프로그램 을 만 듭 니 다. 가장 좋 은 전략 은 게이머 들 이 가장 좋 은 상대 와 대국 할 때 현재 상황 에서 가장 가능 한 총 점 전략 을 얻 을 수 있 도록 하 는 것 입 니 다.당신 의 프로그램 은 항상 두 번 째 유 저 를 위해 최 적 화 된 전략 을 실행 해 야 합 니 다.
격식.
PROGRAM NAME: game1
INPUT FORMAT:
(file game1.in)
첫 번 째 줄: 정수 N 은 시퀀스 의 정수 개 수 를 나타 낸다.
두 번 째 줄 에서 끝까지: 빈 칸 으로 구 분 된 N 개의 정수 (크기 는 1 - 200).
OUTPUT FORMAT:
(file game1.out)
한 줄 만 있 고 빈 칸 으로 구 분 된 두 개의 정수: 유저 1 과 유저 2 의 최종 득점 순 으로 나 뉜 다.
SAMPLE INPUT
6 
4 7 2 9 5 2

SAMPLE OUTPUT
18 11

사고: 재 귀 를 사용 하면 선명 하 게 보이 고 dfs 방법 을 정의 하 며 구간 ns 제 i 에서 j 번 째 수의 최대 치 를 되 돌려 줍 니 다.
여기 서 나 는 단순히 재 귀 해서 스스로 기억 배열 을 하나 더 해서 효율 을 높 일 수 있다.
public class        {
	
	static int[][] sum = new int[1000][1000];//  ns      ,sum[0][3]   0  3     
	static int[] ns = new int[]{4,7,2,9,5,2};//    
	
	/*  :   ns    i j            */
	static int dfs(int i,int j){
		if (i==j) {//       ,     
			return ns[i]; 
		}
		if (Math.abs(i-j)==1) {//         ,           
			return Math.max(ns[i],ns[j]);
		}
/*		        ,                     ,              
		sum[i+1][j] - dfs(i+1, j)+ns[i]                
		sum[i][j-1] - dfs(i, j-1)+ns[j]                
		           ,             -          +       
		*/
		return Math.max(sum[i+1][j] - dfs(i+1, j)+ns[i], sum[i][j-1] - dfs(i, j-1)+ns[j]);
	}
	
	//   sum  
	static void initSum(){
		for (int i = 0; i < ns.length; i++) {
			int tmp = 0;
			for (int j = i; j < ns.length; j++) {
				tmp += ns[j];
				sum[i][j] = tmp;
			}
		}
	}
	
	public static void main(String[] args) {
		initSum();
		System.out.println(dfs(0, 5)+" " + (sum[0][5]-dfs(0, 5)));
		
	}

}

좋은 웹페이지 즐겨찾기