备战蓝桥杯---动态规划之悬线法

Em...属于一知道就会,不知道的话比较难想。

我们先看题:

我们不妨把1抽象成一个平面上的点,因此可以变成这一幅图:

我们假设每一个点被向上牵拉了一根线:

显然,每一条悬线都有可能成为边界限制,我们确定一条悬线,乘上悬线最左可到的+最右可到的距离即可。

首先,对于上下边界的悬线,我们记h[i][j]为(i,j)的悬线长度,易得方程:

h[i][j]=h[i-1][j]+1(a[i][j]=0)或者=0(a[i][j]=1).

我们再维护向左的长度。

我们记l[i][j]表示向左最远.l[i][j]=l[i][j-1]+1(a[i][j]=0)/0(a[i][j]=1)

我们记L[i][j]表示(i,j)这条悬线向左最远。

L[i][j]=min(L[i-1][j],l[i][j]).

向右同理。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int l[100][100],r[100][100],h[100][100],n,a[90][90];
int main(){
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==1){
				h[i][j]=0;
				l[i][j]=0;
			}
			else{
				h[i][j]=h[i-1][j]+1;
				l[i][j]=l[i][j-1]+1;
			}
		}
		for(int j=n;j>=1;j--){
			if(a[i][j]==1){
				r[i][j]=0;
			}
			else r[i][j]=r[i][j+1]+1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(h[i][j]>=2){//注意为2,若为1时会把上面的0带下来,而事实上1的值不用改
				l[i][j]=min(l[i][j],l[i-1][j]);
				r[i][j]=min(r[i][j],r[i-1][j]);
			}
			ans=max(ans,(r[i][j]+l[i][j]-1)*h[i][j]);
		}
	}
	cout<<ans;
} 

那么如果要求是正方形呢?

很简单,我们只要把h[i][j]与r[i][j]+l[i][j]-1取min并平方即可。

我们来看一个变形题吧:

这里有两种方法:

1.我们还是用悬线,只不过转移条件需要修改(与自己颜色不同时转移)

2.我们先进行染色操作,我们按照国际象棋去染色,我们把国际象棋为1的位置进行颠倒。1变成0,0变成1,我们再求其中的全0/1最大子矩形即可(我们反着看,把全0/1的恢复一下不就是了吗)

下面给出法2的AC代码:

#include<bits/stdc++.h>
using namespace std;
int l[2010][2010],r[2010][2010],h[2100][2010],n,m,a[2010][2010];
int l1[2010][2010],r1[2010][2010],h1[2100][2010];
int main(){
	cin>>n>>m;
	int ans0=0,ans1=0,ans00=0,ans11=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int cnt=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(j%2==cnt) a[i][j]=1-a[i][j];
		}
		cnt=1-cnt;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				h[i][j]=0;
				l[i][j]=0;
			}
			else{
				h[i][j]=h[i-1][j]+1;
				l[i][j]=l[i][j-1]+1;
			}
		}
		for(int j=m;j>=1;j--){
			if(a[i][j]==1){
				r[i][j]=0;
			}
			else r[i][j]=r[i][j+1]+1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(h[i][j]>=2){
				l[i][j]=min(l[i][j],l[i-1][j]);
				r[i][j]=min(r[i][j],r[i-1][j]);
			}
			ans0=max(ans0,(r[i][j]+l[i][j]-1)*h[i][j]);
			ans00=max(ans00,min(r[i][j]+l[i][j]-1,h[i][j])*min(r[i][j]+l[i][j]-1,h[i][j]));
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==0){
				h1[i][j]=0;
				l1[i][j]=0;
			}
			else{
				h1[i][j]=h1[i-1][j]+1;
				l1[i][j]=l1[i][j-1]+1;
			}
		}
		for(int j=m;j>=1;j--){
			if(a[i][j]==0){
				r1[i][j]=0;
			}
			else r1[i][j]=r1[i][j+1]+1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(h1[i][j]>=2){
				l1[i][j]=min(l1[i][j],l1[i-1][j]);
				r1[i][j]=min(r1[i][j],r1[i-1][j]);
			}
			ans1=max(ans1,(r1[i][j]+l1[i][j]-1)*h1[i][j]);
			ans11=max(ans11,min(r1[i][j]+l1[i][j]-1,h1[i][j])*min(r1[i][j]+l1[i][j]-1,h1[i][j]));
		}
	}
	cout<<max(ans00,ans11)<<endl;
	cout<<max(ans0,ans1);
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性

文章目录 几种常用的魔术方法1、__destruct()2、__tostring()3、__call()4、__get()5、__set()6、__sleep()7、__wakeup()8、__isset()9、__unset()9、__invoke() 三种变量属性极客2019 PHPphp原生类 几种常用的魔术方法 1、__destruct() 当删除一个对象或对象操作终止时被调…

求职招聘类App如何打造的更卓越:解析关键功能和发展趋势

随着人才市场的竞争日益激烈&#xff0c;求职招聘类App成为现代职场中不可或缺的工具。对您来说&#xff0c;一款卓越的求职招聘类App满足您用户的多样化需求是很有必要的。在这篇文章中&#xff0c;我们将深入探讨其关键功能和行业发展趋势&#xff0c;助您的App在市场中脱颖而…

Docker 安装配置数据库

那么在安装之前小编给猿友们普及一下mysql的作用&#xff01; MySQL是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现在属于Oracle旗下产品。它是世界上最流行的关系型数据库管理系统之一&#xff0c;尤其在WEB应…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

INI 格式配置文件基础知识

前言 INI是英文“初始化”&#xff08;initialization&#xff09;的缩写&#xff0c;它是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键(key)构成&#xff0c;常用于微软Windows操作系统中&#xff0c;这种配置文件的文件扩展名多为INI。INI文件被用来…

第16章-DNS

目录 1. 域名 1.1 产生背景 1.2 概述 1.3 域名的树形层次化结构 2. DNS 2.1 概述 2.2 工作机制 3. DNS查询模式 3.1 递归查询&#xff1a; 3.2 迭代查询&#xff1a; 4. 相关知识点 4.1 集中式DNS 4.2 国内通用DNS 4.3 配置DNS代理 1. 域名 1.1 产生背景 ① IP…

SQL窗口函数, 测试题

第一题 create table user_score (logday date, -- 考试时间 userid VARCHAR(20), -- 考试用户 score int); -- 考试成绩Insert into user_score values (2019-10-20,11111,85) ,(2019-10-20,22222,83) ,(2019-10-20,33333,86) ,(2019-10-21,11111,87) ,(2019-10-2…

蓝桥杯(3.2)

1209. 带分数 import java.io.*;public class Main {static BufferedReader br new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw new PrintWriter(new OutputStreamWriter(System.out));static final int N 10;static int n, cnt;static int[…

Pytorch学习 day02(加载数据、数据集类)

加载数据 * Dataset提供一种方式&#xff1a;来获取数据及其label&#xff0c;给数据进行编号 * Dataloader为神经网络提供不同的数据形式 Dataset的组织形式有很多种&#xff0c;例如&#xff1a; 将label放在文件夹名上&#xff0c;如下&#xff1a; #Dateset # --train #…

10分钟帮您快速理解InfluxDB中的核心概念

InfluxDB是目前时序数据库 (TSDB)最优秀的产品&#xff0c;时序数据库是一种设计和优化的数据库&#xff0c;用于注册和存储始终与特定时间点相关联或使用时间戳的数据。时序数据其实就是在不同时间点收集并按时间排序的数据。对于刚刚接触时序数据库的同学来说&#xff0c;好多…

Matlab偏微分方程拟合 | 源码分享 | 视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

利用css实现常见图形

1、正圆形 给正方形盒子设置圆角属性为宽高的50%。 div {width: 100px;height: 100px;background-color: plum;border-radius: 50%; } 2、胶囊形 给长方形盒子设置圆角属性为盒子高度的50%。 div {width: 200px;height: 100px;background-color: plum;border-radius: 50px…

一个最简单的Three.js的井筒三维云图渲染示例

在Three.js中实现井筒的三维云图渲染&#xff0c;需要先准备井筒的属性数据&#xff0c;例如井筒的几何结构、温度分布、压力分布等。然后&#xff0c;利用Three.js创建对应的三维模型并将属性数据应用到模型上&#xff0c;最终呈现出井筒的三维云图效果。下面是一个简单的示例…

(四)优化函数,学习速率与反向传播算法--九五小庞

多层感知器 梯度下降算法 梯度的输出向量表明了在每个位置损失函数增长最快的方向&#xff0c;可将它视为表示了在函数的每个位置向那个方向移动函数值可以增长。 曲线对应于损失函数。点表示权值的当前值&#xff0c;即现在所在的位置。梯度用箭头表示&#xff0c;表明为了增…

Kubernetes/k8s的核心概念

一、什么是 Kubernetes Kubernetes&#xff0c;从官方网站上可以看到&#xff0c;它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语&#xff0c;它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词&#xff0c;也就是“k8s”&#xff…

3分钟,学会一个测试员必懂 Lambda 小知识!

今天再来给大家介绍下函数式接口和方法引用。 函数式接口 问&#xff1a;Lambda 表达式的类型是什么&#xff1f; 答&#xff1a;函数式接口 问&#xff1a;函数式接口是什么&#xff1f; 答&#xff1a;只包含一个抽象方法的接口&#xff0c;称为函数式接口 &#xff08;…

关于synchronized介绍

synchronized的特性 1. 乐观锁/悲观锁自适应,开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁 2.轻量级/重量级锁自适应 开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁 3.自旋/挂起等待锁自适应 4.不是读写锁 5.非公平锁 6,可重入锁 synchronized的使用 1&#…

如何使用 CrewAI 构建协作型 AI Agents

一、前言 AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步&#xff0c;预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体&#xff0c;我们可以通过一些简单的语音或手势命令&#xff0c;就能完成以往需要手动操作应用程序才能…

【YOLO v5 v7 v8 小目标改进】RFB:组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性

RFB&#xff1a;组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性 提出背景RFB 原理空间感受野结构RFB-Net 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 当前表现最好的目标检测器依赖于深层CNN骨干网络&#xff0c;如ResNet-101和Inception&am…

Vue3 条件渲染 v-show

v-show 指令&#xff1a;用于控制元素的显示或隐藏。 执行条件&#xff1a;当条件为 false 时&#xff0c;会添加一个 display:none 属性将元素隐藏。 应用场景&#xff1a;适用于显示隐藏切换频率较高的场景。 <div v-show"数据">内容</div> 基础用法…