TypicalDPContest B:ゲーム

典型DPコンテストB問題。
http://tdpc.contest.atcoder.jp/tasks/tdpc_game


































自分は自分の得点を最大化する。
相手は相手の得点を最大化する→相手は自分の得点を最小化する
と言い換えることができる。

#include<iostream>
#include<vector>
#include<algorithm>
#define INF (1<<29)
 
using namespace std;
 
int A,B,memo[1001][1001][2];
vector<int>a,b;
 
int rec(int idA,int idB,int turn){
 
  if(idA==A && idB==B)return 0;
  if(memo[idA][idB][turn]<INF)return memo[idA][idB][turn];
 
  int res;
  if(turn==0){
    res=0;
    if(idA<A)res=max(res,rec(idA+1,idB,1)+a[idA]);
    if(idB<B)res=max(res,rec(idA,idB+1,1)+b[idB]);
  }
  else if(turn==1){
    res=INF;
    if(idA<A)res=min(res,rec(idA+1,idB,0));
    if(idB<B)res=min(res,rec(idA,idB+1,0));
  }
 
  return memo[idA][idB][turn]=res;
}
 
int main(void){
 
  fill(*memo[0],*memo[1001],INF);
 
  cin >> A >> B;
  a.resize(A);
  b.resize(B);
  for(int i=0;i<A;i++)cin >> a[i];
  for(int i=0;i<B;i++)cin >> b[i];
 
  cout << rec(0,0,0) << endl;
 
  return 0;
}