codeforces 983B 区间DP

codeforces 983B


题意:

n q l r 给定一串长度为n的数字,q次询问,每次询问给定l和r。
[ l , r ] 问区间[l,r]内所有数字的最大异或和。


题解:

d p [ l ] [ r ] [ l , r ] f [ l ] [ r ] [ l , r ] dp[l][r]表示区间[l,r]内所有数字的最大异或和,用f[l][r]记录区间[l,r]内所有数字的异或和。

  • [ l , r ] f [ l ] [ r ] = f [ l + 1 ] [ r ] f [ l ] [ r 1 ] 枚举区间[l,r]内所有数字的异或和,f[l][r] = f[l+1][r]^f[l][r-1]
  • [ l , r ] d p [ l ] [ r ] = m a x ( f [ l ] [ r ] , m a x ( d p [ l + 1 ] [ r ] , d p [ l ] [ r 1 ] ) ) 记录区间[l,r]内所有数字的最大异或和,dp[l][r] = max(f[l][r], max(dp[l+1][r], dp[l][r-1]))

#include <bits\stdc++.h>
using namespace std;
const int N = 5001;
int f[N][N];
int dp[N][N];

int main() {
    int n, q, l, r;
    cin >> n;
    for(int i = 1 ; i <= n ; i++){
        cin >> f[i][i];
        dp[i][i] = f[i][i];
    }
    for(int len = 2 ; len <= n ; len++){
        for(int l = 1, r = len ; r <= n ; l++, r++){
            f[l][r] = f[l+1][r]^f[l][r-1];
            dp[l][r] = max(f[l][r], max(dp[l+1][r], dp[l][r-1]));
        }
    }
    for(cin >> q ; q > 0 ; q--){
        cin >> l >> r;
        cout << dp[l][r] << endl;
    }
    return 0; 
}

猜你喜欢

转载自blog.csdn.net/CSDN_PatrickStar/article/details/89739922
今日推荐