小 Q 與彼岸花
小 Q 與彼岸花
https://ac.nowcoder.com/acm/contest/11171/B
題意:查詢m次,每次輸出區(qū)間[l, r]內(nèi)兩個數(shù)的最大異或值。
因為是區(qū)間內(nèi)的最大值求解問題,可以通過區(qū)間dp來進(jìn)行分析。
區(qū)間[l,r]內(nèi)的最大值可以由區(qū)間端點l, r, 或者區(qū)間[l + 1, r] 和 [l, r - 1] 內(nèi)的最大值取出。
例如: 有三個數(shù) 1, 2, 3 求區(qū)間[1, 3]內(nèi)的最大值,可以通過求區(qū)間端點1, 3, 或者 區(qū)間【1, 2】, 區(qū)間[2,3]內(nèi)的最大值。
從而得出狀態(tài)轉(zhuǎn)移方程; dp[i][j] = max(a[i] ^ a[j], max(dp[i + 1][j], dp[i][j - 1]))
數(shù)據(jù)范圍 n最大為5e3,時間復(fù)雜度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]; //狀態(tài)轉(zhuǎn)移 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; }