0%

hdu2859 Phalanx

题意

给定一个n阶方阵,问里面最大的对阵子矩阵有多大 要求对称为从左下至右上

题解

稍稍仔细思考一下 这种问题很明显我们需要从小到大 观察一下可以知道 对一个三阶对称子矩阵,可以看出需要满足对称轴上有两个二阶对称子矩阵 同时左上与右下元素要求满足对称,那么可由二阶对称矩阵推至三阶 实际上从一阶到二阶 从三阶到四阶完全是类似的过程 由两个低一阶的对称子矩阵加上一对对称元素即可 那么用dp[i][j]表示坐标(i,j)的对称矩阵最大值,初始值设0,正好满足递推条件,逐次递推即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char matrix[1200][1200];
int dp[1200][1200];
int main(){
int n;
while(scanf("%d",&n),n){
for(int i=0;i<n;++i){
scanf("%s",matrix[i]);
}
memset(dp,0,sizeof(dp));
int ans=0;
for(int i=1;i<n;++i){
for(int j=0;(j+i)<n;++j){
for(int t=0;(t+i)<n;++t){
if(dp[j][t+1]==(i-1)&&dp[j+1][t]==(i-1)&&matrix[j][t]==matrix[j+i][t+i]){
dp[j][t]=i;
ans=i;
}
}
}
}
printf("%d\n",ans+1);
}
return 0;
}