T1 [JZOJ3229] 回文子序列
题目描述
回文序列是指左右对称的序列。我们会给定一个N×M的矩阵,你需要从这个矩阵中找出一个P×P的子矩阵,使得这个子矩阵的每一列和每一行都是回文序列。
数据范围
对于 $20\%$ 的数据,$1 \leq N,M \leq 10$
对于 $100\%$ 的数据,$1 \leq N,M \leq 300$
分析
$O(n^5)$ 暴力跑起来真实快
#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; }
T2 [JZOJ3230] 树环转换
题目描述
给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。
环的定义:(1)该图有N个点,N条边。(2)每个顶点的度数为2。(3)任意两点是可达的。
树的定义:(1)该图有N个点,N-1条边。(2)任意两点是可达的。
数据范围
对于 $20\%$ 的数据,$1 \leq N \leq 10$
对于 $100\%$ 的数据,$1 \leq N \leq 10^6$
分析