题意:查询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; }