最大矩阵的和

最大矩阵的和

真题目录: 点击去查看

E 卷 100分题型

题目描述

给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。

输入描述

输入的第一行包含2个整数n, m(1 <= n, m <= 10),表示一个n行m列的矩阵,下面有n行,每行有m个整数,同一行中,每2个数字之间有1个空格,最后一个数字后面没有空格,所有的数字的在[-1000, 1000]之间。

输出描述

输出一行一个数字,表示选出的和最大子矩阵内所有的数字和。

用例1

输入

3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3

输出

20

说明

一个3*4的矩阵中,后面3列的子矩阵求和加起来等于20,和最大。

题解

思路:将二维的问题转换为一维的问题。

  • 转换思路:最终选择的矩阵行数肯定是[1, n]。枚举出选择任意行的情况。选择多行时将同一列进行相加变成一行。
  • 问题就变成了在一行中求最大连续子数组了。最大子数组的状态转移方程:dp[i] = max(dp[i-1], 0) + nums[i]。
  • 记录每种情况下的连续子数组和最大值,其中的最大值就是结果。

c++

#include <iostream>
#include <vector>
#include <climits>
using namespace std;#define MAX(a, b) ((a) > (b) ? (a) : (b))int getResult(int n, int m, vector<vector<int>>& matrix);
int maxSubArraySum(vector<int>& nums);
vector<int> matrixZip(int rowFrom, int rowTo, int cols, vector<vector<int>>& matrix);int main() {int n, m;cin >> n >> m;vector<vector<int>> matrix(n, vector<int>(m));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> matrix[i][j];}}cout << getResult(n, m, matrix) << endl;return 0;
}int getResult(int n, int m, vector<vector<int>>& matrix) {int ans = INT_MIN;for (int i = 0; i < n; i++) {ans = MAX(ans, maxSubArraySum(matrix[i])); // 单行最大子数组和for (int j = i + 1; j < n; j++) {vector<int> compressed = matrixZip(i, j, m, matrix);ans = MAX(ans, maxSubArraySum(compressed)); // 多行子矩阵最大和}}return ans;
}int maxSubArraySum(vector<int>& nums) {int res = nums[0];int dp = nums[0];for (size_t i = 1; i < nums.size(); i++) {dp = MAX(dp, 0) + nums[i];res = MAX(res, dp);}return res;
}vector<int> matrixZip(int rowFrom, int rowTo, int cols, vector<vector<int>>& matrix) {vector<int> zip(cols, 0);for (int c = 0; c < cols; c++) {for (int r = rowFrom; r <= rowTo; r++) {zip[c] += matrix[r][c];}}return zip;
}

JAVA

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[][] matrix = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = sc.nextInt();}}System.out.println(getResult(n, m, matrix));}public static int getResult(int n, int m, int[][] matrix) {ArrayList<Integer> dp = new ArrayList<>();for (int i = 0; i < n; i++) {dp.add(maxSubArraySum(matrix[i])); // 一行子矩阵最大和for (int j = i + 1; j < n; j++) {dp.add(maxSubArraySum(matrixZip(Arrays.copyOfRange(matrix, i, j + 1)))); // 多行子矩阵最大和}}return dp.stream().max((a, b) -> a - b).orElse(0); // 求出最大和}// 最大子数组和求解public static int maxSubArraySum(int[] nums) {int[] dp = new int[nums.length];int res = dp[0] = nums[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1], 0) + nums[i];res = Math.max(res, dp[i]);}return res;}// 多行子矩阵,压缩为一行子数组public static int[] matrixZip(int[][] matrix) {int cols = matrix[0].length;int rows = matrix.length;int[] zip = new int[cols];for (int c = 0; c < cols; c++) {for (int r = 0; r < rows; r++) {zip[c] += matrix[r][c];}}return zip;}
}

Python

# 输入获取
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for i in range(n)]# 最大子数组和求解
def maxSubArraySum(nums):dp = [0 for i in range(len(nums))]res = dp[0] = nums[0]for i in range(1, len(nums)):dp[i] = max(dp[i - 1], 0) + nums[i]res = max(res, dp[i])return res# 将多行子矩阵,压缩为一维数组
def matrixZip(matrix):cols = len(matrix[0])rows = len(matrix)zip = [0 for i in range(cols)]for c in range(cols):for r in range(rows):zip[c] += matrix[r][c]return zip# 算法入口
def getResult(n, m, matrix):dp = []for i in range(n):dp.append(maxSubArraySum(matrix[i]))for j in range(i + 1, n):dp.append(maxSubArraySum(matrixZip(matrix[i:j + 1])))dp.sort()return dp[-1]# 算法调用
print(getResult(n, m, matrix))

JavaScript

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});let lines = [];
let n, m;
rl.on("line", (line) => {lines.push(line);// 输入第一行时,提取出m、nif (lines.length === 1) {[n, m] = lines[0].split(" ").map((ele) => parseInt(ele));}// 输入第一行后,再输入n行时,则开始启动算法程序if (lines.length - 1 === n) {// 干掉第一行输入,即lines中存储的全是就是matrix要素lines.shift();// matrix是算法程序的入参二维数组let matrix = [];// 将多行输入的matrix要素提取出来存到二维数组中lines.forEach((line) => {matrix.push(line.split(" ").map((ele) => parseInt(ele)).slice(0, m));});// 调用算法程序console.log(maxSubMatrixSum(matrix));// 将输入归0,重新接收下一轮lines.length = 0;}
});function maxSubMatrixSum(matrix) {let dp = [];for (let i = 0; i < matrix.length; i++) {dp.push(maxSubArraySum(matrix[i]));for (let j = i + 1; j < matrix.length; j++) {dp.push(maxSubArraySum(matrixZip(matrix.slice(i, j + 1))));}}return dp.sort((a, b) => b - a)[0];
}function maxSubArraySum(nums) {let dp = new Array(nums.length);let result = (dp[0] = nums[0]);for (let i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1], 0) + nums[i];result = Math.max(result, dp[i]);}return result;
}function matrixZip(matrix) {let cols = matrix[0].length;let rows = matrix.length;let zip = new Array(cols).fill(0);for (let c = 0; c < cols; c++) {for (let r = 0; r < rows; r++) {zip[c] += matrix[r][c];}}return zip;
}

Go

package mainimport ("bufio""fmt""math""os""strconv""strings"
)// 获取最大子矩阵和
func getResult(n, m int, matrix [][]int) int {ans := math.MinInt32for i := 0; i < n; i++ {ans = max(ans, maxSubArraySum(matrix[i])) // 单行最大子数组和for j := i + 1; j < n; j++ {compressed := matrixZip(i, j, m, matrix)ans = max(ans, maxSubArraySum(compressed)) // 多行子矩阵最大和}}return ans
}// 最大子数组和(Kadane's Algorithm)
func maxSubArraySum(nums []int) int {res, dp := nums[0], nums[0]for i := 1; i < len(nums); i++ {dp = max(dp, 0) + nums[i]res = max(res, dp)}return res
}// 多行子矩阵,压缩为一行
func matrixZip(rowFrom, rowTo, cols int, matrix [][]int) []int {zip := make([]int, cols)for c := 0; c < cols; c++ {for r := rowFrom; r <= rowTo; r++ {zip[c] += matrix[r][c]}}return zip
}// 获取最大值
func max(a, b int) int {if a > b {return a}return b
}func main() {// 读取输入scanner := bufio.NewScanner(os.Stdin)scanner.Scan()line := scanner.Text()parts := strings.Fields(line)n, _ := strconv.Atoi(parts[0])m, _ := strconv.Atoi(parts[1])// 读取矩阵matrix := make([][]int, n)for i := 0; i < n; i++ {matrix[i] = make([]int, m)scanner.Scan()rowValues := strings.Fields(scanner.Text())for j := 0; j < m; j++ {matrix[i][j], _ = strconv.Atoi(rowValues[j])}}// 计算结果并输出fmt.Println(getResult(n, m, matrix))
}

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

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

相关文章

Windows图形界面(GUI)-QT-C/C++ - QT Dock Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 工具栏 2. 侧边栏 3. 调试窗口 三、常见样式 1. 停靠位置 2. 浮动窗口 3. 可关闭 4. 可移动 四、属性设置 1. 设置内容 2. 获取内容 3. 设置标题 …

8.PPT:小李-第二次世界大战【21】

目录 NO123 ​ NO4567 ​ NO8\9\10\11​ 图片→格式→大小对话框→锁定纵横比✔动画→飞入→效果选项&#xff1a;方向/序列→开始→持续时间→延迟时间持续时间&#xff1a;1s延迟&#xff1a;0.5s音频剪切时间&#xff1a;0.5s&#xff1a;00:00.500自动换片时间设置&…

React中使用箭头函数定义事件处理程序

React中使用箭头函数定义事件处理程序 为什么使用箭头函数&#xff1f;1. 传递动态参数2. 避免闭包问题3. 确保每个方块的事件处理程序是独立的4. 代码可读性和维护性 示例代码总结 在React开发中&#xff0c;处理事件是一个常见的任务。特别是当我们需要传递动态参数时&#x…

GAN(生成对抗网络,Generative Adversarial Network)

https://www.bilibili.com/video/BV1mp4y187dm/?spm_id_from333.788.recommend_more_video.2&vd_source35b06c13f470dff84c947fa3045bafc3

Docker 国内最新可用镜像源20250205

2年没用dockerhub了结果今天发现镜像无法拉取了&#xff0c;找了很多镜像都无效&#xff0c;连阿里云镜像都不行了&#xff0c;最后找到下面可以用的。 Docker镜像仓库备注hub.urlsa.us.kg可用http://hub.haod.eu.org可用http://hub.chxza.eu.org可用http://ccoc.eu.org部分地…

网站快速收录:如何优化网站音频内容?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/60.html 为了优化网站音频内容以实现快速收录&#xff0c;以下是一些关键的策略和步骤&#xff1a; 一、高质量音频内容创作 原创性&#xff1a; 确保音频内容是原创的&#xff0c;避免使…

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态&#xff1a;主要就是我们前⾯讲的函数重载和函数模板&#xff0c;他们传不同类型的参数就可以调⽤不同的函数&#xff0c;通…

【kafka的零拷贝原理】

kafka的零拷贝原理 一、零拷贝技术概述二、Kafka中的零拷贝原理三、零拷贝技术的优势四、零拷贝技术的实现细节五、注意事项一、零拷贝技术概述 零拷贝(Zero-Copy)是一种减少数据拷贝次数,提高数据传输效率的技术。 在传统的数据传输过程中,数据需要在用户态和内核态之间…

本地大模型编程实战(08)自制聊天机器人(2)

文章目录 准备使用简单的提示词使用复杂一点的提示词总结代码 本文将演示使用大语言模型自制聊天机器人。主要的内容有&#xff1a; 使用 LangGraph 进一步完善聊天机器人使用提示词改变 LLM 的能力 我们将同时使用 llama3.1 和 deepseek 做演示。由于 langchain 可能对不同大…

NeuralCF 模型:神经网络协同过滤模型

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 NeuralCF 模型由新加坡国立大学研究人员于 2017 年提出&#xff0c;其核心思想在于将传统协同过滤方法与深度学习技术相结…

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…

Qt跨屏窗口的一个Bug及解决方案

如果我们希望一个窗口覆盖用户的整个桌面&#xff0c;此时就要考虑用户有多个屏幕的场景&#xff08;此窗口要横跨多个屏幕&#xff09;&#xff0c;由于每个屏幕的分辨率和缩放比例可能是不同的&#xff0c;Qt底层在为此窗口设置缩放比例&#xff08;DevicePixelRatio&#xf…

LeetCode:63. 不同路径 II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]…

自定义数据集 使用paddlepaddle框架实现逻辑回归

导入必要的库 import numpy as np import paddle import paddle.nn as nn 数据准备&#xff1a; seed1 paddle.seed(seed)# 1.散点输入 定义输入数据 data [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6…

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…

Elasticsearch 指南 [8.17] | Search APIs

Search API 返回与请求中定义的查询匹配的搜索结果。 http GET /my-index-000001/_search Request GET /<target>/_search GET /_search POST /<target>/_search POST /_search Prerequisites 如果启用了 Elasticsearch 安全功能&#xff0c;针对目标数据流…

string类OJ练习题

目录 文章目录 前言 一、反转字符串 二、反转字符串 II 三、反转字符串中的单词 III 四、验证一个字符串是否是回文 五、字符串相加&#xff08;大数加法&#xff09; 六、字符串相乘&#xff08;大数乘法&#xff09; 七、把字符串转化为整数&#xff08;atoi&#xff09; 总结…

(一)DeepSeek大模型安装部署-Ollama安装

大模型deepseek安装部署 (一)、安装ollama curl -fsSL https://ollama.com/install.sh | sh sudo systemctl start ollama sudo systemctl enable ollama sudo systemctl status ollama(二)、安装ollama遇到网络问题&#xff0c;请手动下载 ollama-linux-amd64.tgz curl -L …

[CMake]报错: Qt requires a C++17 compiler

1.报错&#xff1a; #error 指令: "Qt requires a C17 compiler, and a suitable value for __cplusplus. On MSVC, you must pass the /Zc:__cplusplus option to the compiler." 2.解决 Qt5项目升级到Qt6项目&#xff0c;cmake需要做兼并配置&#xff1b; # 设置…

面对全球化的泼天流量,出海企业如何观测多地域网络质量?

作者&#xff1a;俞嵩、白玙 泼天富贵背后&#xff0c;技术挑战接踵而至 随着全球化进程&#xff0c;出海、全球化成为很多 Toc 产品的必经之路&#xff0c;保障不同地域、不同网络环境的一致的用户体验成为全球化应用的不得不面对的问题。在跨运营商、跨地域的网络环境中&am…