博弈论的精髓:最坏情况下取最好
f[i][j]
:在先手的情况下,在i
到j
的区间,先手选手和后手的最大分差
#include<iostream>
using namespace std;
const int N = 110;
int n, sum;
int g[N], f[N][N];
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i ++ )
{
cin >> g[i];
sum += g[i];
}
for(int len = 1 ; len <= n ; len ++ )
{
for(int i = 1 ; i + len - 1 <= n ; i ++ )
{
int j = i + len - 1;
f[i][j] = max(g[i] - f[i + 1][j], g[j] - f[i][j - 1]);
}
}
cout << (sum + f[1][n]) / 2 << ' ' << (sum - f[1][n]) / 2 <<endl;
return 0;
}
为什么不是7 + 9 + 5 - 4 - 2 - 2呢,然后一边是21,一边是8,根本理解不了啊,这是什么意思啊?