码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 983B XOR-pyramid

时间:2018-05-17 00:51:22      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:puts   def   子串   color   while   ==   分享   个数   print   

题意:

定义一个函数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 }

 

codeforces 983B XOR-pyramid

标签:puts   def   子串   color   while   ==   分享   个数   print   

原文地址:https://www.cnblogs.com/kickit/p/9048837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!