题意:给你一个正方形矩阵,求他的最大对称子矩阵(正方形)的边长。
思路:最大对称子矩阵。定义
dp[i][j]
d
p
[
i
]
[
j
]
表示以
(i,j)
(
i
,
j
)
为左下角的最大对称子矩阵的边长。
每个点
dp[i][j]
d
p
[
i
]
[
j
]
只能由右上角
dp[i−1][j+1]
d
p
[
i
−
1
]
[
j
+
1
]
的位置转移得到。对于当前位置
(i,j)
(
i
,
j
)
,该行
i
i
右边的字符和该列上面的字符匹配个数为x,如果x大于右上角
dp[i−1][j+1]
d
p
[
i
−
1
]
[
j
+
1
]
,那么就是dp[i][j] = 右上角+1,否则就是 x。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int n, dp[MAXN][MAXN];
char a[MAXN][MAXN];
int main()
{
while (~scanf("%d", &n) && n)
{
for (int i = 0; i < n; i++) scanf("%s", a[i]);
int ans = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == 0 || j == n-1)
{
dp[i][j] = 1;
continue;
}
int t1 = i, t2 = j;
while (t1 >= 0 && t2 < n && a[t1][j] == a[i][t2])
{
t1--; t2++;
}
dp[i][j] = min(i-t1, dp[i-1][j+1]+1);
ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
return 0;
}
/*
3
abx
cyb
zca
4
zaba
cbab
abbc
cacq
0
*/