种草莓【字符串】【动态规划】

http://acm.hnust.edu.cn/JudgeOnline/problem.php?cid=1436&pid=6

求最大正方形边长。

采用动态规划思想,若当前格满足要求,则dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;

但是直接按字符一个一个读入会超时(原因不懂。。。),每行按字符串读就不会了。。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[2005][2005];
char mp[2005][2005];
char ss[2005];

int Min(int a,int b,int c)
{
    int ans=a;
    ans=min(ans,b);
    ans=min(ans,c);
    return ans;
}

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
       memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            scanf("%s",ss);
            for(int j=0;j<n;j++){
                mp[i][j+1]=ss[j];
            }
        }
        int ans=1;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(mp[i][j]=='E'){
                dp[i][j]=Min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
            }
            ans=max(ans,dp[i][j]);
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zxhyxiao/p/8023030.html