题意:
给你一个n*n的字母矩阵,求最大对称子矩阵的长度。
题解:
经典的dp问题。
状态:dp[i][j]表示从(i,j)开始到右上角某一点能形成的最大对称子矩阵长度。
状态转移:
注意枚举顺序,因为是考虑的右上角,我们可以考虑正着枚举i,倒着枚举j。
这样保证了无后效性。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #include<unordered_map> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; char s[1005][1005]; int dp[1005][1005]; int n; int main(){ while(~scanf("%d",&n)&&n){ mst(dp,0); rp(i,0,n-1) scanf("%s",s[i]); rp(i,0,n-1){ RP(j,n-1,0){ dp[i][j]=1; if(i==0||j==n-1) continue; int t=dp[i-1][j+1]; rp(k,1,t){ if(s[i-k][j]==s[i][k+j]) dp[i][j]++; else break; } } } int ans=0; rp(i,0,n-1) ans=max(ans,*max_element(dp[i],dp[i]+n)); printf("%d\n",ans); } return 0; }