hdu 2859 (二維dp)
阿新 • • 發佈:2019-02-15
題意:
給你一個n*n的矩陣,矩陣中只含有26個小寫字母,求其中最大的對稱矩陣的大小
當我們算到s[i][j]時,每次我們只需要將它上方的和右方的依次比較,看是否相同
注意這裡不能只比較s[i-1][j]和s[i][j+1],因為可能出現不符合的情況,如
zaba
cbab
abbc
cacq
當我們比較到紅色的b的時候,如果只比較與他相鄰的兩個即綠色的b,就會從dp[i-1][j+1]多+1,而顯然藍色的部分不同
當i!=0&&dp[i-1][j+1]>i-a時,dp[i][j]=dp[i-1][j+1]+1
當i!=0&&dp[i-1][j+1]<i-a (其中a為從當前位置找,找到的第一個不相等的x的位置,所以i-a就為最大的對稱矩陣的長度)時,dp[i][j]=i-a;
當i==0時,dp[i][j]=1;
#include"stdio.h" #include"string.h" #define N 1001 int dp[N][N]; char s[N][N]; int main() { int n; int i,j; int a,b; int ans; while(scanf("%d",&n)!=-1&&n) { getchar(); for(i=0;i<n;i++) gets(s[i]); ans=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==0)dp[i][j]=1; else { a=i; b=j; while(s[a][j]==s[i][b]) { a--; b++; if(a<0||b>=n)break; } a=i-a; if(a>dp[i-1][j+1]) dp[i][j]=dp[i-1][j+1]+1; else dp[i][j]=a; } if(dp[i][j]>ans)ans=dp[i][j]; } } printf("%d\n",ans); } return 0; }