题目链接在这里: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\n",f[l][r]); 24 } 25 return 0; 26 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》