题意:给定一个n*n正方形(0<n<=1000),求最大的对称正方形,对称线为从左下角到右上角的线。
题解:从右上角开始递推求dp[i][j],怎么得来,看代码
代码:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <string>
// #define int long long
using namespace std;
const int N = 1e3 + 10;
const int INF = 1e9;
int n;
char c[N][N];
int dp[N][N];
signed main() {
while (cin >> n) {
if (n == 0) break;
int i, j, ans = 0;
for (i = 1; i <= n; i++) scanf("%s", c[i] + 1);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) dp[i][j] = 1;
for (i = 1; i <= n; i++) {
for (j = n; j >= 1; j--) {
int ni = i, nj = j;
ni--, nj++;
while (ni >= 1 && nj <= n && dp[i][j] <= dp[i - 1][j + 1] &&
c[ni][j] == c[i][nj]) {
ni--, nj++;
dp[i][j]++;
}
ans = max(ans, dp[i][j]);
}
}
cout << ans << endl;
}
return 0;
}
/*
input:::
3
abx
cyb
zca
4
zaba
cbab
abbc
cacq
0
output:::
3
3
*/