hdu2859 Phalanx(线性dp)

题目

n*n(n<=1e3)的全小写字母矩阵,求图中的最大对称子矩阵的边长

其中对称子矩阵的对角线是从右上角到左下角

bca
ebd
ghi

如上例,以ce为轴,应当输出2

题解

kuangbin的基础dp,软磨硬泡总算刷完了

枚举每个点,把每个点当左下角来看,dp[i][j]从其右上的dp[i-1][j+1]来转移,

转移时,暴力判断本列上分和本行右边能不能扩展,

如果能扩展到对应位置,就是右上的子矩阵规模+1

O(n^3)没敢莽,但赛后暴力了一下n=1e3的全a矩阵,计算量约在3e8,5s足矣

代码

#include<iostream>
#include<cstdio> 
#include<vector>
#include<cstring>
using namespace std;
const int N=1e3+10;
char s[N][N];
int n,dp[N][N];
//复杂度在最坏情况下O(n^3)
//1e3个全a字母 计算量约在3e8 单组样例可以接受
//计算次数最坏情况下约为(2*n-1)*1+(2*(n-1)-1)*2+...+(2*1-1)*n
//敢写敢过 榜上一片过时 先冲一发朴素想法 
int main()
{
	while(~scanf("%d",&n)&&n)
	{
		for(int i=0;i<n;++i)
			scanf("%s",s[i]);
		int ans=1;
		//从右上角起 向左dp 向下dp 
		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 mx=dp[i-1][j+1];
				//暴力比较[i][j] 该列内该位置以上 和 该行内该位置以右 
				for(int k=1;k<=mx;++k)
				{
					if(s[i-k][j]==s[i][j+k])dp[i][j]++;
					else break;
				} 
				ans=max(ans,dp[i][j]);
			}	
		}
		printf("%d\n",ans);
	}
	return 0;
} 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code92007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值