CF 983B XOR-pyramid(区间dp,异或)

本文提供了一道区间DP与异或运算结合的问题解决方案,通过递归定义函数f,求解给定数组区间内的最大f值。采用区间动态规划的方法,实现了高效查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CF 983B XOR-pyramid(区间dp,异或)

若有一个长度为m的数组b,定义函数f为:

\(f(b) = \begin{cases} b[1] & \quad \text{if } m = 1, \\ f(b[1] \oplus b[2],b[2] \oplus b[3],\dots,b[m-1] \oplus b[m]) & \quad \text{otherwise} \end{cases}\)

现在给出长度为n(n<=5000)的数组a,询问q(q<=100000)次,每次询问区间\([li,ri]\)的子区间中,f的最大值。

可以发现,\(f([l,r])\)迭代到倒数第二层,会变成\(f(f([l,r-1]),f([l+1, r]))=f([l, r-1])\oplus f([l+1, r])\)。因此这个就变成区间dp水题了。

#include <cstdio> 
#include <algorithm>
using namespace std;

const int maxn=5005;
int n, q, f[maxn][maxn], maxm[maxn][maxn];  //f[i][j]储存f(ai~aj)的值 

int main(){
    scanf("%d", &n); int k;
    for (int i=1; i<=n; ++i){
        scanf("%d", &f[i][i]); 
        maxm[i][i]=f[i][i];
    }
    for (int i=2; i<=n; ++i)  //区间长度 
        for (int j=1; j<=n-i+1; ++j){  //区间起点 
            k=j+i-1;  //区间终点 
            f[j][k]=f[j][k-1]^f[j+1][k];
            maxm[j][k]=max(maxm[j][k-1], maxm[j+1][k]);
            if (f[j][k]>maxm[j][k]) maxm[j][k]=f[j][k];
        }
    scanf("%d", &q); int l, r; 
    for (int i=0; i<q; ++i){
        scanf("%d%d", &l, &r);
        printf("%d\n", maxm[l][r]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/9048552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值