codeforces 983B XOR-pyramid

    xiaoxiao2023-09-29  148

    题目链接:http://codeforces.com/problemset/problem/983/B

    题目分析

     

    以上给出了 f ( ai , ai+1, ai+2, ai+3 .... aj )的计算方法,要求在[i , j ] 的中 f 的最大值 , 也就是说需要比较所有的f  ,比如比较 f ( ai , ai+1, ai+2) 和  f ( ai , ai+1) 等等。

    那么就先DP出[ 1, n ]所有子区间的f,然后找指定区间中的f最大值即可,不过这个最大值可以求 f ( a1 , a2, a3, .... an )的时候一起求出来。

    代码区

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<map> #include <queue> using namespace std; typedef long long ll; const int Max = 5e3 + 10; const int inf = 0x3f3f3f3f; ll dp[Max][Max]; ll val[Max][Max];//记录区间 [i , j]的值 int main() { std::ios::sync_with_stdio(false); int n; while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; i++) { scanf("%lld", &val[i][i]); dp[i][i] = val[i][i]; } for (int len = 1; len < n; len++)//区间长度 { for (int i = 1; i <= n - len; i++) { val[i][i + len] = (val[i][i+len-1] ^ val[i+1][i + len]); dp[i][i + len] = max(dp[i][i + len - 1], dp[i + 1][i + len]);//为求这个区间的最大值 dp[i][i + len] = max(dp[i][i + len], val[i][i + len]); } } int q; scanf("%d", &q); while (q--) { int x, y; scanf("%d%d", &x, &y); printf("%lld\n", dp[x][y]); } } return 0; }

     

    最新回复(0)