题目链接在这里:Problem - I - Codeforces
这道题首先应该知道一些异或的性质
然后以及动手画一下可以发现b[i][j]=b[i+1][j]^b[i][j-1]
由于这是求区间的最大值,所以我们可以用区间dp解决,因为只是最大值,不涉及到区间中分两半时的操作,所以可以降一维k的复杂度。
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int MAX=5005; 4 int n,m,a[MAX],b[MAX][MAX],f[MAX][MAX]; 5 int main(){ 6 freopen ("i.in","r",stdin); 7 freopen ("i.out","w",stdout); 8 int len,i,j,l,r; 9 scanf("%d",&n); 10 for (i=1;i<=n;i++){ 11 scanf("%d",a+i); 12 f[i][i]=b[i][i]=a[i]; 13 } 14 for (len=2;len<=n;len++) 15 for (i=1;i<=n-len+1;i++){ 16 j=i+len-1; 17 b[i][j]=b[i+1][j]^b[i][j-1]; 18 f[i][j]=max(b[i][j],max(f[i+1][j],f[i][j-1])); 19 } 20 scanf("%d",&m); 21 while (m--){ 22 scanf("%d%d",&l,&r); 23 printf("%d ",f[l][r]); 24 } 25 return 0; 26 }