codeforces 983B XOR-pyramid

题意:

定义一个函数f(a):

给出一个数组a,有q个询问,每次询问回答在l到r的区间内,连续子串的f函数的最大值。

思路:

画图,来自codeforces SheepRanger

由此图可知,f(l,r) = f(l,r-1) ^ f(l+1,r),多画图哇!

所以就变成了区间dp,同时维护f(l,r)与ans(l,r):

f[l][r] = f[l][r-1] ^ f[l+1][r]

ans[l][r] = max(f[l][r],ans[l][r-1],ans[l+1][r])。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 5005;
 6 int dp[N][N];
 7 int a[N];
 8 int ans[N][N];
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     for (int i = 0;i < n;i++) scanf("%d",&a[i]);
14     for (int i = 0;i < n;i++) dp[i][i] = ans[i][i] = a[i];
15     for (int i = 1;i < n;i++)
16     {
17         for (int j = 0;j < n;j++)
18         {
19             int l = j,r = j+i;
20             if (r >= n) break;
21             //if (l == 0 && r == 5) puts("gg");
22             dp[l][r] = dp[l][r-1] ^ dp[l+1][r];
23             ans[l][r] = max(ans[l][r-1],ans[l+1][r]);
24             ans[l][r] = max(ans[l][r],dp[l][r]);
25         }
26     }
27     int q;
28     scanf("%d",&q);
29     while (q--)
30     {
31         int l,r;
32         scanf("%d%d",&l,&r);
33         l--,r--;
34         printf("%d\n",ans[l][r]);
35     }
36     return 0;
37 }

 

posted @ 2018-05-16 23:41  qrfkickit  阅读(448)  评论(8编辑  收藏  举报