HDU 2859 Phalanx

简单二维dp。o(n^3)效率过的。不知道有没有o(n^2)的解法。

为了方便点,先左右交换一下。

dp[i][j]表示以[i,j]为左上角的最大对称矩阵长度

那么dp[i][j]=min(Max,dp[i+1][j+1])+1;

其中Max是以[i,j]为起点,i这一行和j这一列最长公共前缀的长度

#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=1000+10;
char Map[maxn][maxn];
int dp[maxn][maxn];
int n;

int main()
{
    while(~scanf("%d",&n))
    {
        if(!n) break;
        for(int i=0; i<n; i++) scanf("%s",Map[i]);
        for(int i=0; i<n; i++)
            for(int j=0; j<n/2; j++)
                swap(Map[i][j],Map[i][n-j-1]);

        memset(dp,0,sizeof dp);

        int ans=0;
        for(int i=n-1; i>=0; i--)
        {
            for(int j=n-1; j>=0; j--)
            {
                int Max=0;
                for(int len=0;; len++)
                {
                    if(i+len>=n||j+len>=n||Map[i][len+j]!=Map[len+i][j])
                    {
                        Max=len;
                        break;
                    }
                }
                Max--;
                dp[i][j]=min(Max,dp[i+1][j+1])+1;
                ans=max(ans,dp[i][j]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2016-01-20 13:51  Fighting_Heart  阅读(201)  评论(0编辑  收藏  举报