每天一道博弈论之“A game”(伪博弈   题意:   题解:

    n个数字排成一列,每个人只能选择最左边或最右边的数字取掉,自己该回合的得分就是该数字的值。

当两个人都选择最优决策时,问两个人各能得到多少分。

  题解:

  博弈论的外表,实质则是记忆化搜索=-=(不过知道博弈论原理的话应该更好想吧)

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define RI register int
using namespace std;
const int INF = 0x7ffffff ;
const int N = 100 + 10 ;

inline int read() {
    int k = 0 , f = 1 ; char c = getchar() ;
    for( ; !isdigit(c) ; c = getchar())
      if(c == '-') f = -1 ;
    for( ; isdigit(c) ; c = getchar())
      k = k*10 + c-'0' ;
    return k*f ;
}

int n ; int hh[N], pre[N], sg[N][N] ;

int dfs(int l,int r) {
    if(sg[l][r]) return sg[l][r] ;
    if(l == r) return hh[l] ;
    int x = dfs(l+1,r), y = dfs(l,r-1) ;
    x = min(x,y) ;
    return sg[l][r] = pre[r]-pre[l-1]-x ;
}

int main() {
    n = read() ; int tot = 0 ;
    for(int i=1;i<=n;i++) {
        hh[i] = read() ; pre[i] = pre[i-1]+hh[i] ;
    } 
    int tt = dfs(1,n) ;
    printf("%d %d",tt,pre[n]-tt) ;
    return 0 ;
}
View Code