1224 最大子矩阵(动态规划+最大子段和)

news/2025/2/21 9:40:42

最大子矩阵:
1.朴素解法(6 层循环)
两层循环枚举所有的左上角点(lx,ly)
两层循环枚举所有的右下角点(rx,ry)
两层循环针对左上角点(lx,ly)到右下角点(rx,ry)围成的矩阵求和
2.一维前缀和优化(5 层循环)
两层循环枚举所有的左上角点(lx,ly)
两层循环枚举所有的右下角点(rx,ry)
一次循环枚举 lx 到 rx行,针对每一行利用一维前缀和求解[ly,ry]的
区间和
3.二维前缀和优化(4 层循环)
两层循环枚举所有的左上角点(1x,1y)
两层循环枚举所有的右下角点(rx,ry)
使用二维前缀和直接求解左上角点(1x,1y)到右下角点(rx,ry)围成的
矩阵求和
4.维度压缩+最大子段和 dp 思想优化(3 层循环)
两层循环枚举所有的 i1 行和 i2 行
一层循环求解 i1 行到 i2 行之间的最大子矩阵,具体步骤如下:
1.先将 i1 行到 i2 行每一列进行求和(这里使用一维前缀和进行处理)
这样每一列就压缩成一个点,那么 1~n 列就构成了n个点
2.然后对这个 n个点求解最大子段和即 i1~i2 的最大子矩阵

我们首先将所有列的每一行的前缀和求出来,便于后续压缩

之后我们对于所有i1行 到 i2行范围之间的所有列的最大子段和进行求解,在这个过程中,我们将i1行到i2行之间的所有列的前缀和求解作为dp[j]进行存储,这样二维问题就变成了一个点,问题就变成了求解一维数组的最大子段和问题

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

const int N = 1e3 + 10;
#define int long long 

int a[N][N], dp[N];
int presum[N][N];


signed main() {

	int n; cin >> n;
	
	for (int i = 1; i <= n;i++) {
		for (int j = 1; j <= n;j++) {
			cin >> a[i][j];
			presum[i][j] = presum[i - 1][j] + a[i][j];//代表第j列前i行的元素和
		}
	}
	int mx = -127 * n * n;

	//确定上下两行,求两行之间所有列的“最大子段和”
	for (int i1 = 1; i1 <= n;i1++) {
		for (int i2 = i1; i2 <= n;i2++) {
			for (int j = 1; j <= n;j++) {
				//二维问题转化为一维数组的最大子段和
				dp[j] = presum[i2][j] - presum[i1 - 1][j];
			}
			for (int j = 1; j <= n;j++) {
				dp[j] = max(dp[j],dp[j-1]+dp[j]);
				mx = max(mx, dp[j]);
			}
		}
	}
	cout << mx<<endl;

	return 0;
}


http://www.niftyadmin.cn/n/5860631.html

相关文章

敏捷开发06:用户故事估算方法介绍

估算介绍 在以前开发 IT 软件时&#xff0c;使用较多的衡量软件开发工作量的单位是&#xff1a;小时、人天 或 人月。它是预估开发时间。比如&#xff1a;这个功能张三一个人开发需要 3 天时间完成。 这种 “人天” 估算只是 “理想人天” 的估算&#xff0c;有时与实际开发完…

【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载画图1画图2画图3画图4画图5画图6画图7参考介绍 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin & scatter plot & Venn) 加载R包 library…

JS宏实例:数据透视工具的制作(四)

上一节中&#xff0c;我们完成了核心的计算代码部分&#xff0c;本节中将完善事件代码 一、创建所有需求的事件函数 1、窗体初始化 // 窗体初始化 function pivotForm_Initialize(){} function typeSet_Initialize(){} function valueSet_Initialize(){} function allCol…

基于springboot校园健康系统的设计与实现(源码+文档)

大家好我是风歌&#xff0c;今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限&#xff0c;通…

Java 中的方法参数传递与值传递2

文章目录 代码分析传值调用&#xff1a;关键概念结果分析如何实现交换两个对象的值&#xff1f;总结 这段代码演示了如何使用对象和方法进行交换&#xff0c;但它也展示了方法参数传递方式的一个重要概念——传值调用。在 Java 中&#xff0c;参数传递是按值传递的&#xff0c;…

SpringCloud-Eureka初步使用

什么是REST是一组用于规范资源在网络中转移的表现形式软件架构设计风格.简单来说就是客户端和服务器之间的一种交互形式 什么是RESTful,满足了REST风格的接口或者程序,RESTful API是其中的接口,spring中提供了RestTemplate这个类,他强制执行了REST的规范,包括使用HTTP协议的状…

Java集合框架中常用类及其底层数据结构的详细分类

1. 数组&#xff08;Array&#xff09; 特点&#xff1a;内存连续&#xff0c;支持随机访问&#xff0c;增删效率低&#xff08;需扩容或移动元素&#xff09;。 ArrayList 基于动态数组&#xff0c;扩容时创建新数组并拷贝数据&#xff08;默认扩容 1.5 倍&#xff09;。Vec…

深入学习解析:183页可编辑PPT华为市场营销MPR+LTC流程规划方案

华为终端正面临销售模式转型的关键时刻&#xff0c;旨在通过构建MPRLTC项目&#xff0c;以规避对运营商定制的过度依赖&#xff0c;并探索新的增长路径。项目核心在于建设一套全新的销售流程与IT系统&#xff0c;支撑双品牌及自有品牌的战略发展。 项目总体方案聚焦于四大关键议…