hdu 2859 Phalanx (最大对称子矩阵)

hdu 2859 Phalanx (最大对称子矩阵)

Problem Description
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

 题意:找到最大对称的矩阵

每次只需求最外面一层对称个数sum,再和右上角对称矩阵大小加一取最小就行,就求出当前小矩阵的最大对称矩阵。最后取个所有对称矩阵大小的最大值就行。

dp[i][j] = min(sum,dp[i-1][j+1]+1);

hdu 2859 Phalanx (最大对称子矩阵)

#include <cstdio>
#include <map>
#include <iostream>
#include<cstring>
#include<bits/stdc++.h>
#define ll long long int
#define M 6
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
int n;
char G[1007][1007];
int dp[1007][1007];
int main(){
    ios::sync_with_stdio(false);
    while(cin>>n&&n){
        char a;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                cin>>a;
                if(a>='A'&&a<='Z')
                    a+=32;
                G[i][j]=a;
            }
        memset(dp,0,sizeof(dp));
        int ans=-inf;
        for(int i=1;i<=n;i++)
            for(int j=n;j>=1;j--){
                int x=i; int y=j;
                int sum=0;
                while(x>=1&&y<=n&&G[x][j]==G[i][y]){
                    x--; y++;
                    sum++;
                }
                dp[i][j]=min(sum,dp[i-1][j+1]+1);
                ans=max(ans,dp[i][j]);
            }
        cout<<ans<<endl;
    }
}