hdoj2859【DP基础】
2024-08-31 18:35:35
/*
看题解A的。
总结:小矩阵--> 大矩阵
dp[i][j]=min(t,dp[i-1][j+1]+1);
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define MAX 100010
#define mod 9973
#define LL long long
const int N=1e3+10;
char a[N][N];
int dp[N][N];
int n;
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
for(int j=1;j<=n;j++)
dp[i][j]=0;
}
int ans=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==1&&j==n)
dp[i][j]=1;
else{
int t1=i,t2=j;
while(t1>=1&&t2<=n&&a[t1][j]==a[i][t2]){
t1--;
t2++;
}
int t=i-t1;
if(t>dp[i-1][j+1]+1) //这一步其实就是,你想一下大矩阵只满足最外面的上和右对称,但是不能保证里面的对称,所以取这样
dp[i][j]=dp[i-1][j+1]+1;
else
dp[i][j]=t; //这里就是大矩阵上和右达不到小矩阵对称长度。
ans=max(ans,dp[i][j]);
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%d ",dp[i][j]);
puts("");
}*/
cout<<ans<<endl;
}
return 0;
}
最新文章
- Unity3D 脚本手册
- 在将 varchar 值 &#39;&#39; 转换成数据类型 int 时失败
- linux下启动AP热点时出错
- html5 audio音频播放全解析
- onClick,onServerClick,onClientClick
- mha 自动failover 原创
- 【转】 NSString / NSMutableString 字符串处理,常用代码 (实例)
- poj3233之经典矩阵乘法
- SQL修炼道路上必看的书籍
- [C++]C++中的运行时类型检测
- TP-LINK 路由器怎么设置
- Eclipse下载GitHub源码
- git 初探
- ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常
- 【bzoj4817】[Sdoi2017]树点涂色&;&;bzoj3779-重组病毒
- 使用PsExec获取shell执行命令
- python -u 启动python文件的作用,PYTHONUNBUFFERED环境变量的作用
- [javaSE] 网络编程(TCP-并发上传图片)
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- LeetCode 628. 三个数的最大乘积