zoukankan      html  css  js  c++  java
  • 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);

    #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;
        }
    }
  • 相关阅读:
    关于element-ui表格样式设置的方法cell-class-name
    Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例
    Bootstrap switch 切换状态踩坑
    字符串数组去重
    java效率取随机不重复数
    List 的add()与addAll()的区别
    在HTML中限制input 输入框只能输入纯数字
    抽象类继承接口
    IOC容器之Autofac
    浅拷贝和深拷贝
  • 原文地址:https://www.cnblogs.com/wmj6/p/10366768.html
Copyright © 2011-2022 走看看