首页 > 其他分享 >P1387 最大正方形

P1387 最大正方形

时间:2024-08-15 15:38:22浏览次数:7  
标签:const 最大 int P1387 up 正方形 中取 110

DP
1.状态定义:

f[i][j]: 以(i,j)为右下角,可构造的最大正方形的边长

2.状态计算

想一想以(i,j)为右下角的正方形,有哪一个状态转移过来

对于已经确定的点:f[i][j] = x 表示包含(i,j),向上连续x个节点,向左连续x个节点

对于待确定的点:f[i][j] = x,需要考虑f[i-1][j],f[i][j-1],f[i-1][j-1] 中取 min.

最后

答案取所有极大正方形中取最长的边长

#include <bits/stdc++.h>
using namespace std;

const int N = 110;

int n,m;
int a[N][N];
int f[N][N];

int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;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;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans = max(ans,f[i][j]);
		}
	}
	cout<<ans;
	return 0;
}

悬线法

对于一个很大的测试数据,用悬线法

#include <bits/stdc++.h>
using namespace std;

const int N = 110;

int n,m;
bool a[N][N];
int l[N][N],r[N][N],up[N][N];
int ans;

int main() {

	scanf("%d%d",&n,&m);
    
	//初始化
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
		    bool op;
		    cin>>op;
		    if(op) a[i][j] = 1;
			l[i][j] = j;
			r[i][j] = j;
			up[i][j] = 1;
		}
	}

	//延申每一个点的左端点
	for(int i=1; i<=n; i++) {
		for(int j=2; j<=m; j++) {
			if(a[i][j] && a[i][j-1]) {
				l[i][j] = l[i][j-1];
			}
		}
	}

	//延申每一个点的右端点
	for(int i=1; i<=n; i++) {
		for(int j=m-1; j>0; j--) {
			if(a[i][j] && a[i][j+1]) {
				r[i][j] = r[i][j+1];
			}
		}
	}

	//向上最高的矩形,所能达到的宽度
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			if(a[i][j] && a[i-1][j]) {
				up[i][j] = up[i-1][j] + 1;
				l[i][j] = max(l[i-1][j],l[i][j]);
				r[i][j] = min(r[i-1][j],r[i][j]);
			}
			int a = r[i][j] - l[i][j] + 1;  //宽度 
			int b = min(a,up[i][j]);   //取更小的-正方形
			ans = max(b,ans) ;
		}
	}
	printf("%d",ans);
	return 0;
}

标签:const,最大,int,P1387,up,正方形,中取,110
From: https://www.cnblogs.com/ltphy-/p/18361086

相关文章

  • 【LeetCode:3148】矩阵中的最大得分(Java)
    题目链接3148.矩阵中的最大得分题目描述给你一个由正整数组成、大小为mxn的矩阵grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为c1的单元格移动到值为c2的单元格的得分为c2-c1。你可以从任一单元格开始......
  • 二分图最大匹配(匈牙利算法)
    二分图最大匹配(匈牙利算法)算法思路寻找增广路即一条以选中边开始,以选中边结束的路,它有一个重要的性质:选中边比未选中边多一.只需要不断贪心的找增广路,直到不存在为止具体实现以dfs(深度优先)为例1.从左部1号开始搜寻增广路2.令当前点编号为x遍历右部与x相连的点3.若当前......
  • ST表 RMQ问题(区间最大/最小值查询)
    #include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;intf[100005][22];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)scanf("%d"......
  • 最大最小化模型
    目录前言一、最大最小化问题的一般数学模型二、问题提出三、模型建立1.建立目标函数2.建立约束四、代码实现1.fminimax函数2.输入目标函数3.进行求解前言在对策论中,我们常遇到这样的问题:在最不利的条件下,寻求最有利的策略.在实际问题中也有许多求最大值的最小化问题,例如急救......
  • 每日一题:Leetcode-662 二叉树最大宽度
    力扣题目解题思路java代码力扣题目:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些......
  • Playwright 浏览器窗口最大化
    实现方式浏览器启动时,加参数args=['--start-maximized'];创建上下文时,加参数no_viewport=True。fromplaywright.sync_apiimportPlaywright,sync_playwrightdefrun(playwright:Playwright)->None:browser=playwright.chromium.launch(headless=False,arg......
  • 洛谷题单指南-常见优化技巧-P1115 最大子段和
    原题链接:https://www.luogu.com.cn/problem/P1115题意解读:最大连续子序列的和。解题思路:DP的做法可参考:https://www.cnblogs.com/jcwy/p/18144124也可以采用双指针来枚举:i从1开始,j=i用j来枚举连续序列,如果已有序列和+下一个a[j]>=下一个a[j],那个j一直++,累加序列和如果出......
  • 提升企业竞争力:最大化APS智能排产效果的策略
    APS构建排程模型的基础数据准确性数据收集与清洗根据APS排程建模的需求建立全面的数据收集机制,确保所有与生产相关的数据,如物料库存、设备状态、人力资源、生产订单信息、销售订单、采购订单等,都能被准确、及时地录入系统;并依据需求建立同步的时间和数据更新、增加、删除的数据......
  • DHU OJ 二维数组 n 层正方形
     思路及代码//n个数s=2n-1/*1111112221123211222111111*///num1row(1,1)->(1,5),(5,1)->(5,5);column(1,1)->(5,1),(1,5)->(5,5)//num2row(2,2)->(2,4),(4.2)->(4,4);column(2,2)->(4,2),(2,4)->(4,4)//num3row(3,3)-......
  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......