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 }
康复训练中~欢迎交流!