luogu1387:最大正方形:子矩阵问题

题目连接

  • 该题是luogu试炼场的2-17:T3

题目大意

  1. n*m的棋盘,每个格子有一个0/1的数值;
  2. 求一个最大的正方形子矩阵,要求矩阵内都是1;
  3. 输出这个最大子矩阵的边长;

题目分析

  • 经典的子矩阵问题,问什么设什么:f[i][j]表示以(i,j)为右下角的子矩阵,能构成正方形的边长的最大值;
  1. 如果a[i][j]的值是0,f[i][j]不存在子矩阵;
  2. 如果a[i][j]的值是1,f[i][j]的值肯定与:左边,上边,左上,这三个格子的值有关;
    luogu1387:最大正方形:子矩阵问题_第1张图片
  3. 如上图,灰色和蓝色格子都是已知的,则橙色格子的值,只受到蓝色格子的影响;
  4. 因为橙色格子所在的子矩阵,需要同时包涵三个蓝色的格子,所以三个蓝色格子中的最小值+1,就是橙色格子的f值;


思路

  • 因为求最大子矩阵,所以过程中更新一下ans,得到答案;
思路1参考代码
//luogu1387:最大正方形
 
#include
using namespace std;

int a[110][110];
int f[110][110];
int n,m,ans;

int main()
{
	scanf("%d %d",&n,&m);
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j])
			{
				f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
				ans=max(ans,f[i][j]);
			}
		}
	}
	
	printf("%d",ans);
	
	return 0;
}

你可能感兴趣的:(题解,大礼包,luogu,DP,矩阵,棋盘DP)