题意:给定一个函数 f(b) ,含义及递推式如题。现在给你一个长度为 n 的序列 b ,然后有 q 次询问,每次询问给定 L , R,求[L,R]区间内所有子串中函数 f() 的最大值。
分析:区间DP。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5005;
int dp[N][N];
int f[N][N];
int n,q,l,r;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>f[i][i];
for(int i=1;i<=n;i++) dp[i][i]=f[i][i];
for(int len=1;len<n;len++)
for(l=1;l+len<=n;l++)
{
r=l+len;
f[l][r]=f[l][r-1]^f[l+1][r];
dp[l][r]=max(f[l][r],max(dp[l][r-1],dp[l+1][r]));
}
cin>>q;
while(q--)
{
cin>>l>>r;
cout<<dp[l][r]<<endl;
}
return 0;
}