HDU 2859 Phalanx
简单二维dp。o(n^3)效率过的。不知道有没有o(n^2)的解法。
为了方便点,先左右交换一下。
dp[i][j]表示以[i,j]为左上角的最大对称矩阵长度
那么dp[i][j]=min(Max,dp[i+1][j+1])+1;
其中Max是以[i,j]为起点,i这一行和j这一列最长公共前缀的长度
#include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<vector> #include<string> #include<iostream> #include<algorithm> using namespace std; const int maxn=1000+10; char Map[maxn][maxn]; int dp[maxn][maxn]; int n; int main() { while(~scanf("%d",&n)) { if(!n) break; for(int i=0; i<n; i++) scanf("%s",Map[i]); for(int i=0; i<n; i++) for(int j=0; j<n/2; j++) swap(Map[i][j],Map[i][n-j-1]); memset(dp,0,sizeof dp); int ans=0; for(int i=n-1; i>=0; i--) { for(int j=n-1; j>=0; j--) { int Max=0; for(int len=0;; len++) { if(i+len>=n||j+len>=n||Map[i][len+j]!=Map[len+i][j]) { Max=len; break; } } Max--; dp[i][j]=min(Max,dp[i+1][j+1])+1; ans=max(ans,dp[i][j]); } } printf("%d\n",ans); } return 0; }