区间dp——cf983b

 推出一个很神奇的结论就可以进行dp了

这个结论不光可以用在异或操作上,还可以用在任意操作里

/*
首先可以做出一个关于f的递推式
 f[1..n]=f[ f[1..n-1],f[2..n] ]
那么直接把f[l][r]都算出来,然后用dp[l][r]求区间最大值 
*/
#include
using namespace std;
#define maxn 5005
#define ll long long
ll f[maxn][maxn],dp[maxn][maxn];
ll n,a[maxn];

void init(){
    for(int i=1;i<=n;i++)f[i][i]=a[i];
    for(int len=2;len<=n;len++)
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            f[l][r]=f[l][r-1]^f[l+1][r];
        }
    for(int i=1;i<=n;i++)dp[i][i]=a[i];
    for(int len=2;len<=n;len++)
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            dp[l][r]=f[l][r];
            dp[l][r]=max(dp[l][r],max(dp[l+1][r],dp[l][r-1]));
        }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    init();
    int q;cin>>q;
    while(q--){
        int l,r;
        cin>>l>>r;
        cout<'\n';
    }
} 

 

转载于:https://www.cnblogs.com/zsben991126/p/11172264.html

你可能感兴趣的:(区间dp——cf983b)