Submission #1595354


Source Code Expand

//http://tdpc.contest.atcoder.jp/tasks/tdpc_game
//http://tdpc.contest.atcoder.jp/submissions/1532417
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <vector>
#include <string>
#include <string.h>
#include <iomanip>
#include <limits>
using namespace std;
const long long int INF=1e17;
const int MAX_N=10000;
int A,B,a[1000],b[1000];

int dp[1001][1001]; 
//dp[i][j]=Aがi個、Bがj個残っている状態から始めた時の終了時の価値の最大値。
//dp[i][j] = max(dp[i-1][j]+a[A-i+1], dp[i][j-1]+b[B-i+1]) /先手の番
//dp[i][j] = min(dp[i-1][j],dp[i][j-1]) /後手の番、先手の価値が少なくなるように動く
//dp[i][0] = dp[i-1][0]+a[A-i+1] /先手
//dp[i][0] = dp[i-1][0] /後手
//dp[0][j] = dp[0][j-1]+b[B-i+1] /先手
//dp[0][j] = dp[0][j-1] /後手

int main(){
	cin >> A >> B;
	for(int i=0;i<A;i++) cin >> a[i];
	for(int i=0;i<B;i++) cin >> b[i];
	
	int f=(A+B)%2;
	dp[0][0]=0;
	for(int i=0;i<A;i++) dp[i+1][0] = ((i+1)%2==f?dp[i][0]+a[A-i-1]:dp[i][0]);
	for(int j=0;j<B;j++) dp[0][j+1] = ((j+1)%2==f?dp[0][j]+b[B-j-1]:dp[0][j]);
	for(int i=0;i<A;i++){
		for(int j=0;j<B;j++){
			if((i+j)%2==f) dp[i+1][j+1] = max(dp[i][j+1]+a[A-i-1], dp[i+1][j]+b[B-j-1]);
			else dp[i+1][j+1] = min(dp[i][j+1],dp[i+1][j]);
		}
	}
	
	cout << dp[A][B] << endl;
	return 0;
}

Submission Info

Submission Time
Task B - ゲーム
User ecasdqina
Language C++14 (GCC 5.4.1)
Score 3
Code Size 1427 Byte
Status AC
Exec Time 6 ms
Memory 4224 KB

Judge Result

Set Name All
Score / Max Score 3 / 3
Status
AC × 5
Set Name Test Cases
All 00, 01, 02, 90, 91
Case Name Status Exec Time Memory
00 AC 1 ms 256 KB
01 AC 5 ms 3456 KB
02 AC 6 ms 4224 KB
90 AC 1 ms 256 KB
91 AC 1 ms 256 KB