HDU2859
题意
给你一个n*n的矩阵,矩阵中只含有26个小写字母,求其中最大的对称矩阵的大小(对称矩阵:对角线是左下到右上)
分析
主要是根据题意找到突破口:每个对称矩阵的最下角
定义:以dp[i][j]为左下角的最大对称矩阵
转移:扩展的时候转移一下就好
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<cstdio> using namespace std; const int maxn = 1000+10; int dp[maxn][maxn]; int n; char s[maxn][maxn]; int main() { while(scanf("%d", &n)!=EOF) { if(n==0) break; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%s", s[i]+1); } int maxx=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int x=i, y=j; if(x==1||y==n) { dp[i][j]=1; } else { while(s[x][j] == s[i][y]&&x>=1&&y<=n) { x--; y++; } int ans=i-x; if(ans>=dp[i-1][j+1]+1) dp[i][j]=dp[i-1][j+1]+1; else dp[i][j]=ans; } maxx=max(maxx,dp[i][j]); } } printf("%d\n", maxx); } return 0; }
要么优秀要么生锈