T1 [JZOJ3229] 回文子序列

题目描述

  回文序列是指左右对称的序列。我们会给定一个 $N \times M$ 的矩阵,你需要从这个矩阵中找出一个 $P \times P$ 的子矩阵,使得这个子矩阵的每一列和每一行都是回文序列。

数据范围

  对于 $20\%$ 的数据,$1 \leq N,M \leq 10$

  对于 $100\%$ 的数据,$1 \leq N,M \leq 300$

分析

  $O(n^5)$ 暴力跑起来真实快

2019-08-22 纪中NOIP模拟A&B组

2019-08-22 纪中NOIP模拟A&B组
#include <iostream>
#include <cstdio>
#include <cstdlib> 
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 305

int n, m, flag;
int g[N][N];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &g[i][j]);
    for (int k = min(n, m); k; k--)
        for (int x = 1; x + k - 1 <= n; x++)
            for (int y = 1; y + k - 1 <= m; y++) {
                flag = 1;
                for (int i = 0; i < k; i++) {
                    for (int j = 1; j <= k / 2; j++)
                        if (g[x + i][y + j - 1] != g[x + i][y + k - j] ||
                            g[x + j - 1][y + i] != g[x + k - j][y + i]) {
                            flag = 0; break;
                        }
                    if (!flag) break;
                }
                if (flag) {printf("%d", k); return 0;}
            }
    
    return 0;
}
View Code

相关文章: