子矩阵最大累加和
时间:2019-01-18
本文章向大家介绍子矩阵最大累加和,主要包括子矩阵最大累加和使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
子矩阵最大累加和
给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。
蓝桥备战资料《算法很美》Chapter4——多维数组和矩阵
先想到了一维数组的求子数组最大累加和的题目,时间复杂度为O(n),利用这种思维来处理这道题目。
第一行:-1 -1 -1,最大累加和为-1
第一行+第二行:-2 1 1,最大累加和为2
第一行+第二行+第三行:-3 0 0,最大累加和为0
第二行:-1 2 2,最大累加和为4
第二行+第三行:-2 1 1,最大累加和为2
第三行:-1 -1 -1,最大累加和为-1
这样一来就可以知道子矩阵的最大累加和为4。
需要用到双重循环遍历行的组合,然后利用使用一次一维数组的最大累加和,因此时间复杂度为O(n3)。
#include<iostream>
#include<climits>
using namespace std;
int **arr;
// 一维数组最大子数组累加和
int maxSum(int *arr, int n){
int s = INT_MIN;
int tempS = 0;
for(int i = 0; i < n; i++){
tempS += arr[i];
if(tempS > s){
s = tempS;
}
if(tempS < 0){
tempS = 0;
}
}
return s;
}
// 子矩阵最大累加和
int maxSum(int **arr, int n){
int s = INT_MIN;
int tempS = 0;
// 从第一行到最后一行
for(int i = 0; i < n; i++){
// tempSum为第i行到第j行之间各列之和
int *tempSum = new int[n];
for(int j = 0; j < n; j++){
tempSum[j] = 0;
}
// i和j一起确定子矩阵的宽度
for(int j = i; j < n; j++){
// tempSum保存各列的和
for(int k = 0; k < n; k++){
tempSum[k] += arr[j][k];
}
// 调用一维数组的求最大累加和方法
tempS = maxSum(tempSum, n);
if(tempS > s){
s = tempS;
}
}
delete(tempSum);
}
return s;
}
int main(){
int n;
while(cin >> n){
// 动态创建二维数组
arr = new int*[n];
for(int i = 0; i < n; i++){
arr[i] = new int[n];
}
// 输入数据
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> arr[i][j];
}
}
// 查找子矩阵最大累加和
cout << maxSum(arr, n) << endl;
// 释放数组资源
for(int i = 0; i < n; i++){
delete(arr[i]);
}
delete(arr);
}
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JDK 8 新特性之函数式编程 → Stream API
- golang 单元测试框架实践
- 想要成为前端Star 吗?一首歌时间将React/Vue 应用Docker 化
- 60亿次for循环,原来这么多东西
- 不要再问我 in,exists 走不走索引了...
- 知乎太可恶了,一言不合就封号?
- 5年Java开发经验,面试挂在MySQL InnoDB上!大厂究竟多看重MySQL?
- 是你们的力量,让知乎看见了!
- 视屏面试传输协议到底是TCP还是UDP
- prometheus学习笔记(1)-mac单机版环境搭建
- Metaspace内存不足导致FGC问题排查
- useful-scripts
- 清空所有 NSUserDefaults 记录
- 重温Java Web的技术细节
- 国密算法SM2加解密_签名验签图形化例子