Problem Desciption
给你一个n * n的矩阵,求符合对称矩阵的最大子矩阵的宽度。(对称矩阵)以左下角到右上角的对角线,其他字母按照这条对角线对称。
思路:
1*1的矩阵,肯定是对称矩阵,所以可以对第一行初始化为1。状态转移方程:第二行开始就变成2*2的子矩阵了,这时候以自身为开始,向上,向右比较(匹配),相等的数量称为匹配数。如果匹配数大于dp[i - 1][j + 1]。dp[i][j] = dp[i - 1][j + 1] + 1。否则就等于匹配数。
#include<bits/stdc++.h>
using namespace std;
char s[1005][1005];
int dp[1005];
int main()
{
int n, i, j, num;
while(~scanf("%d", &n) && n)
{
for(i = 0; i < n; i++)
{
scanf("%s", s[i]);
}
for(i = 1; i < n; i++)
dp[i] = 1;
int ans = 0;
for(i = 1; i < n; i++)
{
for(j = 0; j < n; j++)
{
num = 0;//匹配数
while(i - num >= 0 && j + num < n)//从自身开始上向,向右开始比较大小
{
if(s[i - num][j] == s[i][j + num])
num++;
else break;
}
if(num > dp[j + 1])//匹配数大于dp[i - 1][j + 1],可以降低空间复杂度,改为一维
{
dp[j] = dp[j + 1] + 1;//更新
}
else dp[j] = num;//更新
ans = max(ans, dp[j]);//求最大
}
}
if(!ans) printf("1\n");
else
printf("%d\n", ans);
}
}