最大子矩阵(动态规划c++)

2023-10-31

题目描述:

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 × 1)子矩阵。
比如,如下4 × 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。

输入:

输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。

输出:

输出最大子矩阵的大小。

样例:

输入:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
输出:
15

思路:

我们都知道在一维情况下求最大连续子序列和的操作其实就是求最大连续子序列:

for(int i=1;i<=n;i++)
{
    dp[i]=max(a[i],dp[i-1]+a[i]);
}

那么该怎么推广到二维情况下呢:

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

步骤:

1. 求矩阵1*k(k=1,2,3,4)
就是求每行的最大连续子序和
0 -2 -7 0 ans=0
9 2 -6 2 ans=11
-4 1 -4 1 ans=1
-1 8 0 -2 ans=8

2. 求矩阵大小是2*k(k=1,2,3,4)
这时我们可以在第1,2行或2,3行或3,4行找最大矩阵
例如:
0 -2 -7 0
9 2 -6 2

因为取的是矩阵,肯定是竖着一列都取的,不可能这一列取到第i个元素,上一列取到第i-1个元素,这样我们就可以把要求的两行,两两加起来
9 0 -13 2

这样求出的最大连续子序和是9,这个结果也就是这个矩阵对应的最大矩阵和。

同理把

9 2 -6 2
-4 1 -4 1

-4 1 -4 1
-1 8 0 -2
也分别加起来,三种情况下求出的最大值,就是2*k大小矩阵的最大值

3. 3 * k和4 * k的矩阵也是这样,最后求出最大子矩阵


代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int a[105][105],b[105][105],dp[105];//b[j][k]表示从i行加到j行 第k列值的大小,将二维转为一维 
int ans,n;
void solve(int j)
{
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++)
	{
		dp[i]=max(b[j][i],b[j][i]+dp[i-1]);
		ans=max(ans,dp[i]);
	}
}
int main()
{
	cin>>n;
	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++)//从第i行开始加 
	{
		memset(b,0,sizeof(b));
		for(int j=i;j<=n;j++)//加到第j行 
		{
			for(int k=1;k<=n;k++)//第k列
			{
				b[j][k]=a[j][k]+b[j-1][k];
			} 
			 solve(j);
		}		
	}
	cout<<ans<<endl;
	
	return 0;
 } 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大子矩阵(动态规划c++) 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 18 回文字符串 (后续用动态规划再做一下)

    题目 思路 题解 方法1 思路都在代码里了 class Solution public int countSubstrings string s 每个值都作为中心值 左右两个指针 但是要考虑奇偶的情况bb 和 aba gt i前面的字符串是
  • sql_mode设置(临时or永久)

    临时和永久设置MySQL sql mode非容器方式和容器方式 MySQL 文章目录 临时和永久设置MySQL sql mode 前言 查看sql mode 临时修改sql mode 永久修改sql mode 永久修改sql mode 容器
  • 工业操作系统不是ARM吗?鸿蒙是

    未来工厂如何建 工厂要怎样的数字化平台 褚健认为 面向未来的数字化工厂建议 需要走一条大规模 低成本 生态化之路 正如移动互联时代需要安卓 iOS APP 智能工厂时代需要工厂操作系统 工业APP 工厂操作系统的基础理念包括统一的数据底座
  • ykhmi是什么触摸屏软件_一体机使用中常见问题-中达优控

    1 一体机的屏在组态软件中选择的型号 4 3寸一体机选S430A 5寸一体机选S500A 7寸一体机选S700A 10寸一体机选S1001A 2 一体机发脉冲的Y点用法 A 步进电机驱动器 伺服电机驱动器可以直接接 B 可以用来驱动指示灯
  • Java程序员不得不会的124道面试题(含答案)

    专注于编程 互联网动态 最终将总结的技术 心得 经验 数据结构与算法 源码分析等 享给大家 这里不只限于技术 还有职场心得 生活感悟 以及面经 点击上方 关注按钮 第一时间送达 多线程 并发及线程的基础问题 1 Java 中能创建 vola
  • Chandy-Lamport快照算法仿真实现

    Chandy Lamport快照算法仿真实现 分布式系统中存在的问题 在简单的非分布式环境中发现的问题 如互斥 饿死和死锁等 它们都有可能出现在分布式环境中 实际上 后一种环境下出现这些问题的可能性更大 因为它涉及到很多的实体 它们会引起混
  • 《Java基础教程案例》读书心得

    建议新入门的Java程序猿观看 书籍里面共包含 11 章内容 涵盖了Java基础的全部知识 配备了 20 个任务案例 22到思考题 这本书在我读完以后觉得还是挺不错的一本书 每章的知识点讲的还是挺详细的 最主要的还是你学过此章节的知识点后
  • 传统制造业进行转型过程当中所要面临的主要难点

    在历史上 人类经历了四次工业革命 每一次工业革命都会伴随着一个标志性事物的出现 比如蒸汽机 这标志着人类进入了蒸汽时代 这也是第一次工业革命的开始 第二次工业革命以电力的出现为代表 标志着人类进入了电力时代 以计算机的出现为代表的第三次工业
  • 使用 Kotlin Compose Desktop 实现了一个简易的"手机助手"

    1一 adbd connector adbd connector 是一个实现 adb server 和 adb daemon 之间的通信协议的库 使用 Kotlin 编写 支持 PC 端直接连接 Android 设备操作 adb 相关的指令
  • Vue命令行终端插件使用——vue-web-terminal

    今天分享一个用Vue写的网页端终端插件 可以在web页面模拟原生命令行终端实现一些高级的操作 插件地址 https github com tzfun vue web terminal npm地址 https www npmjs com pa
  • echarts两个饼图关联

    需求一开始显示两张饼图 第一张是各罪名数量的饼图 第二张是嫌疑人各文化数量的饼图 显示之后 要求点击第一个饼图的某个罪名 第二张饼图显示该罪名嫌疑人各文化数量的饼图 给第一张饼图绑定点击事件 默认传入params参数 会输出你点击的这个饼图
  • 代码启动流程

    1 新建Vue项目 vue create app 2 运行项目 yann serve 3 安装electron插件 vue add vue cli plugin electron builder 选择Electron版本 这里需要等很久 请
  • QT实现浏览器访问网页,使用QWebEngineView,支持播放mp4

    QT实现浏览器访问网页 使用QWebEngineView 支持播放mp4 参考 https blog csdn net weixin 40355471 article details 120698537 增加了调试和播放mp4的功能 屏幕放
  • moment.js

    将时间戳转换为number moment Number date format
  • 用itext生成指定宽和动态高的二维码图片

    为什么80 的码农都做不了架构师 gt gt gt 标题和摘要中都提到 本文的一个目的就是生成定宽的二维码图片 还有一个很特别的要求 打印出来得图片需要被条码枪识别 用的第三方工具类库是itext 版本是2 0 为了实现二维码的指定宽高 我
  • Error in render: “TypeError: Cannot read properties of undefined (reading ‘length‘)“

    报错如下 在vue获取后台系统的菜单menu时 报此错 length未定义 经排查 是vue访问后台获取menu list数组的长度时引发的 那么问题来了 后台menu菜单的length必然是 gt 0的 但是这里未获取到就离谱 因为项目在
  • Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作

    前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站 如何配置Servlet简单实现表单提交 如何配置MySQL实现JSP数据库查询 这篇文章主要讲述Servlet表单的提交 Java中实现数据库的查询操作和自己遇到的瓶
  • Vue组件的组成结构

    1 由3个标签节点构成
  • JavaScript如何运行

    项目场景 一些小伙伴刚入手前端开发 对Javascript十分陌生 下面就专门总结运行js文件的几种常用方法 一 Node js Node js 就是运行在服务端的 JavaScript Node js是一个事件驱动I O服务端JavaSc
  • 最大子矩阵(动态规划c++)

    题目描述 已知矩阵的大小定义为矩阵中所有元素的和 给定一个矩阵 你的任务是找到最大的非空 大小至少是1 1 子矩阵 比如 如下4 4的矩阵 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩阵是 9 2 4 1 1