dp【i】【j】表示先手所能获得的最大值
dp【i】【j】 = sum【i】【j】 - min{ dp【i】【k】 , dp【q】【j】,0 } k从i到j-1 q从i+1到j
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[110][110];
int f[110][110], g[110][110];
int N, num[110], sum[110];
int main(){
while( cin >> N && N ){
sum[0] = 0;
for( int i = 1; i <= N; i++ ){
cin >> num[i];
sum[i] = num[i] + sum[i-1];
}
for( int i = 1; i <= N; i++ ){
dp[i][i] = f[i][i] = g[i][i] = num[i];
}
for( int L = 1; L < N; L++ ){
for( int i = 1; i + L <= N; i++ ){
int j = i + L;
int temp = 0;
temp = min( temp, f[i+1][j] );
temp = min( temp, g[i][j-1] );
dp[i][j] = sum[j] - sum[i-1] - temp;
f[i][j] = min( dp[i][j], f[i+1][j] );
g[i][j] = min( dp[i][j], g[i][j-1] );
}
}
cout << 2 * dp[1][N] - sum[N] << endl;
}
return 0;
}