Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC.
A phalanx is a matrix of size n*n, each element is a character (a~z or A~Z), standing for the military branch of the servicemen on that position.
For some special requirement it has to find out the size of the max symmetrical sub-array. And with no doubt, the Central Military Committee gave this task to ALPCs.
A symmetrical matrix is such a matrix that it is symmetrical by the “left-down to right-up” line. The element on the corresponding place should be the same. For example, here is a 3*3 symmetrical matrix:
cbx
cpb
zcc
Input
There are several test cases in the input file. Each case starts with an integer n (0<n<=1000), followed by n lines which has n character. There won’t be any blank spaces between characters or the end of line. The input file is ended with a 0.
Output
Each test case output one line, the size of the maximum symmetrical sub- matrix.
Sample Input
3 abx cyb zca 4 zaba cbab abbc cacq 0
Sample Output
3 3
找出最大对称方阵(左下 - 右上)
状态转移方程dp[ i ][ j ] = dp[ i -1 ][j + 1] + 1 需要判断条件 即对称字母个数的大小
#include<bits/stdc++.h>
using namespace std;
int dp[1100][1100];
char mp[1100][1100];
int main(){
int n;
while(cin >> n && n){
for(int i = 0; i <= n - 1; i++)
{
cin >> mp[i];
}
int Max = 1;
for(int i = 0; i <= n - 1; i++)dp[0][i] = 1;//初始化第一行对称方阵大小
for(int i = 1; i <= n - 1; i++){
for(int j = 0; j <= n - 1; j++){
int x, y;
x = i - 1;
y = j + 1;
int sum = 1;
while(x >= 0 && y <= n - 1 && mp[x][j] == mp[i][y]){/*查找第j列(向上)与第i行(向右)对称字母的个数*/
x--;
y++;
sum++;
}
if(sum >= dp[i - 1][j + 1] + 1)dp[i][j] = dp[i - 1][j + 1] + 1;
else dp[i][j] = sum;
Max = max(Max, dp[i][j]);
}
}
cout << Max << endl;
}
return 0;
}