设f[i][j]为第i层的第j个数,可得 f[i][j] = f[i - 1][j - 1] ^ f[i - 1][j]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5005;
ll dp[maxn][maxn], f[maxn][maxn];
int main() {
int n, m, l, r;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld\n", &f[i][i]);
dp[i][i] = f[i][i];
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i + l - 1 <= n; i++) {
int j = i + l - 1;
f[i][j] = f[i][j - 1] ^ f[i + 1][j];
}
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i + l - 1 <= n; i++) {
int j = i + l - 1;
dp[i][j] = max(f[i][j], max(dp[i][j - 1], dp[i + 1][j]));
}
}
scanf("%d", &m);
while(m--) {
scanf("%d%d", &l, &r);
printf("%lld\n", dp[l][r]);
}
return 0;
}
京公网安备 11010502036488号