zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    「manacher」
    「回文自动机」
    「可持久化数据结构(平衡树、trie树、线段树) 」
    「后缀数组」
    「LCT」
    「网络流」
    「一些知识点」
    「至今不会」
    「推荐博客」
    「最小生成树」
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5455715.html
Copyright © 2011-2022 走看看