HDU 2859 Phalanx

题意:输入n,然后输入n行n列的字符。求这个矩阵中子矩阵是关于左下角到右上角这条线对称的最大矩阵边。

解析:枚举每一个点作为对称轴的左下角,然后从这一点分别向上和向右寻找,知道找到一个不相等的字符,或者这个点越界,停止。

如果这个矩阵比以这个点右上角的点大,那么更新dp[i][j]=dp[i-1][j+1]+1.否则dp[i][j]等于这个矩阵的边。

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <algorithm>

using namespace std;

const int maxn = 1005;

char str[maxn][maxn];
int dp[maxn][maxn];

int main()
{
    int n;
    while(scanf("%d", &n),n)
    {
        for(int i=1; i<=n; i++)
        {
            scanf("%s", str[i]+1);
        }
        memset(dp, 0, sizeof(dp));
        int Max = 1;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(i==1)
                    dp[i][j] = 1;
                else
                {
                    int up = i, right = j;
                    while(str[up][j]==str[i][right])
                    {
                        up--;
                        right++;
                        if(up<1||right>n)
                            break;
                    }
                    int x = i - up;
                    if(x>dp[i-1][j+1])
                        dp[i][j] = dp[i-1][j+1]+1;
                    else
                        dp[i][j] = x;
                    Max = max(Max, dp[i][j]);
                }
            }
        }
        printf("%d
", Max);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/mengzhong/p/5455715.html