Codeforces Round #483 (Div. 2) D. XOR-pyramid dp的应用

input:

6
1 2 4 8 16 32
4
1 6
2 5
3 4
1 2

output:

60
30
12
3

刚开始没有看到要取最大值,就一直在哪里找哪里错了,仔细一看原来有一个最大的需要。

思路:用一个数组存好每两个数之间的^数值,然后比较^的数、以及推出^的两个数,在三个数中找最大值,然后存进数组中。

单纯的dp。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=5006;
 5 int dp[maxn][maxn];
 6 int n;
 7 
 8 int main()
 9 {
10     ios_base::sync_with_stdio(0); cin.tie(0);
11     cout.tie(0);
12     while( cin >> n){
13         for(int i=1;i<=n;i++){
14             cin >> dp[1][i];
15         }
16         for(int i=2;i<=n;i++)
17             for(int j=1;j<=n-i+1;j++)
18                 dp[i][j]=dp[i-1][j]^dp[i-1][j+1];
19 
20         for(int i=2;i<=n;i++){
21             for(int j=1;j<=n-i+1;j++)
22                 dp[i][j]=max(dp[i][j],max(dp[i-1][j],dp[i-1][j+1]));
23         }
24 
25         int kk;
26         cin >> kk;
27         while(kk--){
28             int x,y;
29             cin >> x >> y;
30             int mid=y-x+1;
31             cout << dp[mid][x] << endl;
32         }
33     }
34 
35     return 0;
36 }

 

posted @ 2018-05-16 18:15  flyer_duck  阅读(281)  评论(0编辑  收藏  举报