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
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
3 abx cyb zca 4 zaba cbab abbc cacq 0
3 3
转自kuangbin:
对于每个字符看该列以上和该行右侧的字符匹配量,如果匹配量大于右上角记录下来的矩阵大小,就是右上角的数值+1,否则就是这个匹配量。
感觉好巧啊,这方法,真是自愧不如啊。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000+7;
const int inf = 1e9;
int n;
char tu[MAXN][MAXN];
int dp[MAXN][MAXN];
int main()
{
while(~scanf("%d",&n) && n)
{
for(int i = 0 ; i < n ; ++i)scanf("%s",tu[i]);
int ans = 0;
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j < n ; ++j)
{
if(!i || j == n-1)dp[i][j] = 1;
else
{
int t1 = i,t2 = j,sum = 0;
while(t1 >= 0 && t2 < n && tu[t1][j] == tu[i][t2])
{
t1--;
t2++;
sum++;
}
if(sum > dp[i-1][j+1])dp[i][j] = dp[i-1][j+1] + 1;
else dp[i][j] = sum;
}
ans = max(ans,dp[i][j]);
}
printf("%d\n",ans);
}
}