题意:查询m次,每次输出区间[l, r]内两个数的最大异或值。
因为是区间内的最大值求解问题,可以通过区间dp来进行分析。
区间[l,r]内的最大值可以由区间端点l, r, 或者区间[l + 1, r] 和 [l, r - 1] 内的最大值取出。
例如: 有三个数 1, 2, 3 求区间[1, 3]内的最大值,可以通过求区间端点1, 3, 或者 区间【1, 2】, 区间[2,3]内的最大值。
从而得出状态转移方程; dp[i][j] = max(a[i] ^ a[j], max(dp[i + 1][j], dp[i][j - 1]))
数据范围 n最大为5e3,时间复杂度O(n^2),所以随便过。
ac代码:

#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[5010];
int ans[5010][5010];
int dp[5010][5010];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int len = 2; len <= n; ++len) {
        for (int i = 1; i <= n - len + 1; ++i) {
            int j = i + len - 1;
            dp[i][j] = a[i] ^ a[j];
            //状态转移 
            dp[i][j] = max(dp[i][j], max(dp[i + 1][j], dp[i][j - 1]));
        }
    }

    int l, r;
    while (m--) {

        cin >> l >> r;
        cout << dp[l][r] << endl;
    }
    return 0;
}