思路:
博弈+dp,详见
代码:
#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include using namespace std;#define y1 y11#define fi first#define se second#define pi acos(-1.0)#define LL long long#define ll long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair #define pli pair #define pii pair #define piii pair #define pdd pair #define mem(a, b) memset(a, b, sizeof(a))#define debug(x) cerr << #x << " = " << x << "\n";#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//headconst int N = 1e3 + 10;int L[N][N], R[N][N], T, n, a[N];int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = n; i >= 1; --i) { L[i][i] = R[i][i] = a[i]; for (int j = i+1; j <= n; ++j) { int l = L[i][j-1], r = R[i][j-1], x = a[j]; if(x == r) L[i][j] = 0; else if(x < r && x < l) L[i][j] = x; else if(l <= x && x < r) L[i][j] = x+1; else if(r < x && x < l) L[i][j] = x-1; else L[i][j] = x; l = L[i+1][j], r = R[i+1][j], x = a[i]; if(x == l) R[i][j] = 0; else if(x < r && x < l) R[i][j] = x; else if(l < x && x < r) R[i][j] = x-1; else if(r <= x && x < l) R[i][j] = x+1; else R[i][j] = x; } } if(n == 1) printf("1\n"); else if(a[1] == L[2][n]) printf("0\n"); else printf("1\n"); } return 0; }