HDU
来源:互联网 发布:消费观念 知乎 编辑:程序博客网 时间:2024/05/29 09:52
题目大意:给出一个字母矩阵,求最大的对称子矩阵的大小,对称轴左下到右上。
解题思路:枚举每个字母,判断上和右的字母是否相同,while 直到不同跳出。
dp 表示当前字母为子矩阵左下角时,对称矩阵的大小。
#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 1000+5;using namespace std;int dp[MAXN][MAXN];char map[MAXN][MAXN];int n, ans;int main() { while (scanf("%d\n", &n) && n ) { for (int i = 0; i < n; i++) gets(map[i]); ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (i == 0) dp[i][j] = 1; else { int a = i; int b = j; while (map[a][j] == map[i][b]) { a--; b++; if (a < 0 || b >= n) break; } dp[i][j] = min(dp[i-1][j+1]+1, i-a); } if (dp[i][j] > ans) ans = dp[i][j]; } printf("%d\n", ans); } return 0;}