|Vijos|动态规划|P1057 盖房子

https://vijos.org/p/1057

设f[i][j]为以i,j为正方形右下顶点的最大边长
不难得出初始值 f[i][j] = a[i][j] ,a为输入数组
则有状态转移方程 f[i][j] = min(f[i-1][j], f[i-1][j-1], f[i][j-1]);
因为f[i][j]只能从这些点得出 

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdlib>
#define ms(i,j) memset(i,j,sizeof(i));
using namespace std;
/*
	设f[i][j]为以i,j为正方形右下顶点的最大边长
	不难得出初始值 f[i][j] = a[i][j] ,a为输入数组
	则有状态转移方程 f[i][j] = min(f[i-1][j], f[i-1][j-1], f[i][j-1]);
	因为f[i][j]只能从这些点得出 
*/
int f[1005][1005];
int a[1005][1005];
int main()
{
	int n,m;
	scanf("%d%d", &n, &m);
	for (int i=0;i<n;i++)
	for (int j=0;j<m;j++)
	{
		scanf("%d", &a[i][j]);
		f[i][j] = a[i][j];
	}
	int ans = -10;//有可能会整幅图都是瑕疵 
	for (int i=0;i<n;i++)
	for (int j=0;j<m;j++)
	if (a[i][j]==1)
	{
		f[i][j] = min(min(f[i-1][j], f[i][j-1]), f[i-1][j-1])+1;
		ans = max(f[i][j], ans);
	}
	printf("%d\n", ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值