zoukankan      html  css  js  c++  java
  • HDU

    Phalanx

    题目大意:

    给你一个n*n大小且只由小写字母和大写字母组成的矩阵,要你求一个关于左下角到右上角对称的最大子矩阵。

    数据范围:

    1n1000

    解题思路:

    对于每一个点都有可能是最大子矩阵的左下角,那么对于dp[i][j]即代表以(i,j)点为子矩阵左下角时的最大对称子矩阵,它又可以由dp[i-1][j+1]转移过来,如果满足s[x][j]=s[i][y](1xi,jyn)字符个数len超过了dp[i-1][j+1]+1那么就能够更新答案,即dp[i][j]=dp[i1][j+1]+1,否则当其不超过时,由于(i,j)和(i-1,j+1)在一条对角线上,所以以(i,j)为左下角时dp[i][j]=len

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn = 1000;
    int dp[maxn + 5][maxn + 5];
    char s[maxn + 5][maxn + 5];
    int n, Max;
    int main() {
        while(~scanf("%d", &n)) {
            if(n == 0)break;
            Max = 0;
            for(int i = 1; i <= n; i++)scanf("%s", s[i] + 1);
            memset(dp, 0, sizeof(dp));
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    int Lx = i, Ly = j;
                    while(Lx >= 1 && Ly <= n && s[Lx][j] == s[i][Ly])Lx--, Ly++;
                    int d = i - Lx;//记录匹配长度
                    if(d >= dp[i - 1][j + 1] + 1) dp[i][j] = dp[i - 1][j + 1] + 1;
                    else dp[i][j] = d;
                    Max = max(Max, dp[i][j]);
                }
            }
            printf("%d
    ", Max);
        }
        return 0;
    }
  • 相关阅读:
    博客园主题故障记录及哔哩哔哩主题备份
    Cesium中的primitive竖立流光飞线
    PostgreSQL密码重置方法_WOLF
    软著代码整理技巧总结
    mapboxGL轨迹展示与播放_LZUGIS
    转载 博客园主题——Bili2.0
    为影像数据去除无效值_慕名ArcGIS
    CesiumJS如何自定义浮框
    Cesium中的primitive流光轨迹
    Cesium 地形采样点
  • 原文地址:https://www.cnblogs.com/TRDD/p/9813523.html
Copyright © 2011-2022 走看看