• 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
    ",ans[l][r]);
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    js使用笔记
    rabbit-mq使用官方文档
    tomcat Enabling JMX Remote
    Venom的简单使用
    Random模块
    时间模块
    shulti模块简述
    Python的os模块
    Python压缩及解压文件
    Kali的内网穿透
  • 原文地址:https://www.cnblogs.com/kickit/p/9048837.html
Copyright © 2020-2023  润新知