解题:CF983B pyramid

题面

题目都告诉我们是“金字塔”了,不妨分析分析$f$的性质

$f(a_1,a_2)=f(a_1$ $xor$ $a_2)=a1$ $xor$ $a_2$

$f(a_1,a_2,a_3)=f(a_1$ $xor$ $a_2,a_2$ $xor$ $a_3)=a_1$ $xor$ $a_3=f(a_1,a_2)$ $xor$ $f(a_2,a_3)$

$f(a_1,a_2,a_3,a_4)=f(a_1$ $xor$ $a_2,a_2$ $xor$ $a_3,a_3$ $xor$ $a_4)=f(a_1$ $xor$ $a_3,a_2$ $xor$ $a_4)=a_1$ $xor$ $a_2$ $xor$ $a_3$ $xor$ $a_4=f(a_1,a_2,a_3)$ $xor$ $f(a_2,a_3,a_4)$

......

可以用数(da)学(li)归(da)纳(biao)法证明,$f(a_1,a_2,...,a_n)=f(a_1,a_2,...,a_{n-1})$ $xor$ $f(a_2,a_3,...,a_n)$

然后就是不会DP的蒟蒻都会做的区间(大概不算?)DP辣

设$dp[i][j]$表示$(i,j)$的最优答案,那么有枚举长度$i$和起点$j$,就有$dp[j][j+i-1]=max(max(dp[j+1][j+i-1],dp[j][j+i-2]),f(j,j+i-1))$,水水

 1 //get~
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=5005;
 7 int num[N],xorr[N][N],dp[N][N];
 8 int n,m,t1,t2;
 9 int xoring(int l,int r)
10 {
11     if(l==r) return num[l];
12     if(~xorr[l][r]) return xorr[l][r];
13     return xorr[l][r]=(xoring(l,r-1)^xoring(l+1,r));
14 }
15 int main ()
16 {
17     scanf("%d",&n);
18     for(int i=1;i<=n;i++)
19         scanf("%d",&num[i]);
20     scanf("%d",&m);
21     memset(xorr,-1,sizeof xorr);
22     for(int i=1;i<=n;i++)
23         for(int j=1;j<=n-i+1;j++)
24             dp[j][j+i-1]=max(max(dp[j+1][j+i-1],dp[j][j+i-2]),xoring(j,j+i-1));
25     for(int i=1;i<=m;i++)
26         scanf("%d%d",&t1,&t2),printf("%d
",dp[t1][t2]);
27     return 0;
28 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/9684729.html