标签:
这是一个零和博弈,最高得分只和序列以及谁先手有关。
d[i][j],表示i到j的序列当前取的这个人的最高得分,转移以后状态是新的区间和另一个人取,从中取最小值。
决策的最小值也可递推。
#include<bits/stdc++.h> using namespace std; const int MX = 101; int d[MX][MX],f[MX][MX],g[MX][MX]; int sum[MX]; //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int n; while(scanf("%d",&n),n){ for(int i = 1; i <= n; i++){ scanf("%d",sum+i); } for(int i = 1; i <= n; i++){ g[i][i] = f[i][i] = d[i][i] = sum[i]; sum[i] += sum[i-1]; } for(int L = 1; L < n; L++){ for(int i = 1; i+L <= n; i++){ int j = i+L; d[i][j] = sum[j] - sum[i-1] - min(0,min(f[i+1][j],g[i][j-1])); f[i][j] = min(d[i][j],f[i+1][j]); g[i][j] = min(d[i][j],g[i][j-1]); } } printf("%d\n",(d[1][n]<<1)-sum[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jerryRey/p/4846919.html