每天一道博弈论之“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 ; }