#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod = 255;
int dp[255][255];
int sum[20014];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n); int limit = (int)sqrt(2 * n) + 1;
sum[0] = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &sum[i]);
//sum[i] = 100000;
sum[i] += sum[i - 1];
}
dp[1][2] = -2100000000; dp[1][1] = -2100000000;
for (int i = n; i >=1; i--)
{
for (int j = limit; j>=1; j--)
{
if (i - 1 + j <=n)
{
dp[i&mod][j] = sum[i - 1+j] - sum[i - 1];
int res=0;
if (i + j + j - 1 <= n)res= dp[(i + j)&mod][j];
if (i + j + j <= n)res = max(res, dp[(i + j)&mod][j + 1]);//因为对手是不会让你好过的所以真实情况必须减最大
dp[i&mod][j] -= res;
}
//printf("%d %d\n", i, j);
}
}
printf("%d\n", max(dp[1][1], dp[1][2]));
}
return 0;
}
其实就是一个对抗搜索的裸体,对抗搜索你只能从后往前因为后面最坏的才是真实的,前面状态再好,对现在是木有影响的,对手是不会让你好过的。嘿嘿。。。
然后注意k的范围。
注意 注意优化空间
然后就是从后往前dp
哦,还有对抗搜索的显著特征就是那个人让局面最小,另一个人让局面最大,其实让局面最小的那个人只是相对于对手的,就是想让对手的得分最少,那么相当于自己得分最多
对于这题,bob想让局面差最小其实就是想让自己得分最大,因为当差值是负数的时候,如果用bob-alice不就是正么。。。
如果此题改成bob想得分最少,alice想得分最多,那么就是一个dp而不是对抗搜索了,这样相当于就是求最大差值了,这就是一个完完全全的dp了。(我木有告诉你我原来就是这样理解的?)