推出一个很神奇的结论就可以进行dp了
这个结论不光可以用在异或操作上,还可以用在任意操作里
/* 首先可以做出一个关于f的递推式 f[1..n]=f[ f[1..n-1],f[2..n] ] 那么直接把f[l][r]都算出来,然后用dp[l][r]求区间最大值 */ #include<bits/stdc++.h> using namespace std; #define maxn 5005 #define ll long long ll f[maxn][maxn],dp[maxn][maxn]; ll n,a[maxn]; void init(){ for(int i=1;i<=n;i++)f[i][i]=a[i]; for(int len=2;len<=n;len++) for(int l=1;l+len-1<=n;l++){ int r=l+len-1; f[l][r]=f[l][r-1]^f[l+1][r]; } for(int i=1;i<=n;i++)dp[i][i]=a[i]; for(int len=2;len<=n;len++) for(int l=1;l+len-1<=n;l++){ int r=l+len-1; dp[l][r]=f[l][r]; dp[l][r]=max(dp[l][r],max(dp[l+1][r],dp[l][r-1])); } } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; init(); int q;cin>>q; while(q--){ int l,r; cin>>l>>r; cout<<dp[l][r]<<' '; } }