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

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);
} 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述&#xff1a;php没有难题 考点总结&#xff1a;脑洞题目&#xff0c;不如我出&#xff08;狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候&#xff0c;提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …

Jenkins的安装和helloworld Pipeline

文章目录 环境安装下载安装启动初始化 PipelineUISCM&#xff08;Source Control Management&#xff09;准备pipeline 参考 环境 RHEL 9.3Jenkins 2.44.0.1 安装 参考 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 。 下载安装 [ding192 ~]$ sudo …

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)

安装k8有多种方式如&#xff1a; minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip &#xff1a;192.168.113.120 2G运存 2内核 node1 ip &#xff1a;192.168.113.121 2G运存 2内核 node2 ip &#xff1a;192.168.1…

ctf_show笔记篇(web入门---爆破)

爆破 21&#xff1a;直接bp抓包跑字典&#xff0c;需base64加密 22&#xff1a;可用工具跑也可用浏览器找还可以用网上做好的域名查找去找 23&#xff1a;此题需跑脚本已经附上自写脚本 最后跑出来六个答案一个一个尝试得到答案为3j import hashlibm "0123456789qwert…

适配器模式在微服务的巧妙应用

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作。适配器模式通常用于将一个类的接口转换成客户端期望的另一种接口&#xff0c;从而使原本因接口不兼容而不能一起工作的类可以一起工作。 适配器模式的…

Hololens 2应用开发系列(2)——MRTK基础知识及配置文件配置(上)

Hololens 2应用开发系列&#xff08;2&#xff09;——MRTK基础知识及配置文件配置 一、前言二、MRTK基础知识2.1 MRTK概述2.2 MRTK运行逻辑2.3 MRTK配置文件介绍2.4 MRTK服务 三、配置文件使用3.1 总配置文件3.2 相机配置3.3 其他配置 参考文献 一、前言 在前面的文章中&…

【python】1.python3.12.2和pycharm社区版的安装指南

欢迎来CILMY23的博客喔&#xff0c;本篇为【python】1.python3.12.2和pycharm社区版的安装指南&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 目录 一、python3.12.2的下载与安装 1.1下载 1.2安装 二、pycharm的安装 2.1下载安装 2…

【C语言】文件及文件操作详解(fseek,ftell,rwind)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 二进制文件和文本文件 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文件的顺序读写 6.文件的随机读写 6.1 fseek 6.2 ft…

PySide6+VSCode Python可视化环境搭建

#记住在cmd中运行&#xff0c;不要在vscode里运行&#xff0c;否则env会装到工程目录下 python -m venv env #env\Scripts\activate.bat pip install pyside6 下载本期源码 vscode装一个PYQT Integration插件&#xff0c;设置好两个路径&#xff08;下面有个脚本用于获取路径&…

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天&#xff0c;物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物&#xff0c;实现信息的智能感知、传输和处理&#xff0c;为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术&#xff0c;实现城市…

docker三剑客compose+machine+swarm小结

背景 在容器领域&#xff0c;不少公司会使用docker三剑客composemachineswarm进行容器编排和部署&#xff0c;本文就简单记录下这几个工具的用法 三剑客composemachineswarm compose compose主要是用于容器编排&#xff0c;我们部署容器时&#xff0c;容器之间会有依赖&…

Leetcode630. 课程表 III

Every day a Leetcode 题目来源&#xff1a;630. 课程表 III 解法1&#xff1a;反悔贪心 经验告诉我们&#xff0c;在准备期末考试的时候&#xff0c;先考的课程先准备。同理&#xff0c;lastDay 越早的课程&#xff0c;应当越早上完。但是&#xff0c;有的课程 duration 比…