标签:alice decide play from blog contains sam ide www.
InputThe first line contains an integer TT
(1≤T≤101≤T≤10
), the number of the test cases.
For each test case:
the first line contains a numbers nn
(1≤n≤200001≤n≤20000
);
the second line contains n numbers: V1,V2…VnV1,V2…Vn
. (?100000≤Vi≤100000?100000≤Vi≤100000
)
OutputFor each test case, print a single number in a line: the difference between the total value of gems Alice took and the total value of gems Bob took.
Sample Input
1 3 1 3 2
Sample Output
4
#include<bits/stdc++.h> using namespace std; const long long INF = 1e18; const int N = 20000 + 10; const int K = 210; const int TN = 255 + 10; const int MOD = 255; int T, n; int v[N], pre[N], dp[2][TN][K]; int main() { scanf("%d", &T); while(T-- && scanf("%d", &n)!=EOF) { memset(dp, 0, sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%d", &v[i]); pre[i] = pre[i-1] + v[i]; } int lmt = sqrt(n*2.0) + 1; for(int idx=n;idx;idx--) for(int k=lmt;k;k--) { if(idx+k <= n) { dp[0][idx&MOD][k] = pre[idx+k-1] - pre[idx-1] + max(dp[1][(idx+k)&MOD][k], dp[1][(idx+k+1)&MOD][k+1] + v[idx+k]); dp[1][idx&MOD][k] = -pre[idx+k-1] + pre[idx-1] + min(dp[0][(idx+k)&MOD][k], dp[0][(idx+k+1)&MOD][k+1] - v[idx+k]); } else if(idx+k-1 <= n) { dp[0][idx&MOD][k] = dp[1][(idx+k)&MOD][k] + pre[idx+k-1] - pre[idx-1]; dp[1][idx&MOD][k] = dp[0][(idx+k)&MOD][k] - pre[idx+k-1] + pre[idx-1]; } } printf("%d\n", dp[0][1][1]); } }
标签:alice decide play from blog contains sam ide www.
原文地址:http://www.cnblogs.com/--lr/p/7587333.html