自己再做的时候不知道怎么就过了。。。只是我的还是二维的dp而已。。
char mp[mxn][mxn];
int dp[mxn][mxn];
int n;
int check(int x,int y){
int dif=0;
for(int i=1;i<=min(x-1,n-y);++i){
if(x-i<1||y+i>n)break;
dif++;
if(mp[x-i][y]!=mp[x][y+i])return dif-1;
}
return dif;
}
int main(){
// freopen("in.txt","r",stdin);
while(~sf("%d",&n)&&n){
for(int i=1;i<=n;++i){ sf("%s",mp[i]+1); }
for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)dp[i][j]=1;
int ans=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
//pf("%d ",check(i,j));
dp[i][j]=max(dp[i][j],min(dp[i-1][j+1],check(i,j)+1));
ans=max(ans,dp[i][j]);
}//puts("");
}
/*
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
pf("%d ",dp[i][j]);
}puts("");
}
*/
pf("%d\n",ans);
}
}
本文介绍了一种使用二维动态规划解决寻找字符串矩阵中最长回文子串的问题的方法。通过定义状态转移方程并实现相应的检查函数来更新状态,最终找到最长的回文长度。
223

被折叠的 条评论
为什么被折叠?



