Phalanxios
先搬翻譯spa
Descriptions:.net
Input翻譯
多組數據。每一組第一行是一個 n (0<n<=1000),下面是n行,每一行有n個字母,中間沒有空格。數據以n=0結束。code
Outputblog
每組數據輸出最大的對稱矩陣的邊長。ip
Sample Inputci
3 abx cyb zca 4 zaba cbab abbc cacq 0
Sample Outputget
3 3
題目連接:string
https://vjudge.net/problem/HDU-2859
dp[i][j] 代表的是你在第i行第j列的時候的最大對稱矩陣
dp[i][j]能夠在知足條件的狀況下轉移到dp[i-1][j+1]的狀態上來
AC代碼
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x, y) memset(x, y, sizeof(x)) #define Maxn 1000+10 using namespace std; int n,len,ans; char s[Maxn][Maxn];//存圖像 int dp[Maxn][Maxn];//在第i行第j列的時候的最大對稱矩陣 int main() { while(cin>>n&&n!=0) { ans=1;//初始化 MEM(s,0); MEM(dp,0); for(int i=0; i<n; i++)//存圖形 for(int j=0; j<n; j++) cin>>s[i][j]; for(int i=0; i<n; i++)//開始一個一個爲頂點開始搜索 { for(int j=n-1; j>=0; j--) { dp[i][j]=1;//每個字母 其自己就是一個對稱矩陣 if(i==0||j==n-1)//邊緣部分不用管 continue; int t=dp[i-1][j+1];//其右上角那個點是t階 //檢測這個點是否能超過右上角的對稱矩陣 for(int k=1; k<=t; k++) { if(s[i-k][j]==s[i][k+j]) dp[i][j]++; else break; } ans=max(ans,dp[i][j]); } } cout<<ans<<endl; } return 0; }