题目链接:http://codeforces.com/problemset/problem/983/B
题目分析
以上给出了 f ( ai , ai+1, ai+2, ai+3 .... aj )的计算方法,要求在[i , j ] 的中 f 的最大值 , 也就是说需要比较所有的f ,比如比较 f ( ai , ai+1, ai+2) 和 f ( ai , ai+1) 等等。
那么就先DP出[ 1, n ]所有子区间的f,然后找指定区间中的f最大值即可,不过这个最大值可以求 f ( a1 , a2, a3, .... an )的时候一起求出来。
代码区
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<map>
#include <queue>
using namespace std;
typedef long long ll;
const int Max = 5e3 + 10;
const int inf = 0x3f3f3f3f;
ll dp[Max][Max];
ll val[Max][Max];//记录区间 [i , j]的值
int main()
{
std::ios::sync_with_stdio(false);
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 1; i <= n; i++)
{
scanf("%lld", &val[i][i]);
dp[i][i] = val[i][i];
}
for (int len = 1; len < n; len++)//区间长度
{
for (int i = 1; i <= n - len; i++)
{
val[i][i + len] = (val[i][i+len-1] ^ val[i+1][i + len]);
dp[i][i + len] = max(dp[i][i + len - 1], dp[i + 1][i + len]);//为求这个区间的最大值
dp[i][i + len] = max(dp[i][i + len], val[i][i + len]);
}
}
int q;
scanf("%d", &q);
while (q--)
{
int x, y;
scanf("%d%d", &x, &y);
printf("%lld\n", dp[x][y]);
}
}
return 0;
}