当前位置: 首页 > 编程日记 > 正文

求一个矩阵的最大子矩阵

#include <iostream>
#include <string>
#include <assert.h>
#include <malloc.h>
#include <iostream>
#include <stdlib.h>
#include <memory.h>
#include <time.h>
#include <limits.h>using namespace std;//动态分配rows行、cols列的二维数组
template<typename T>
bool allocateMemory2D(T ***p, const int rows, const int cols)
{*p = NULL;*p = (T **)malloc(rows * sizeof(T *));if (*p == NULL) return false;memset(*p, 0, sizeof(T *)* rows);for (int i = 0; i < rows; i++){(*p)[i] = (T *)malloc(cols * sizeof(T));if ((*p)[i] == NULL) return false;}return true;
}//释放二维动态数组的空间
template<typename T>
void freeMemory2D(T ***p, const int rows)
{if (*p != NULL){for (int i = 0; i < rows; i++){if ((*p)[i] != NULL){free((*p)[i]);(*p)[i] = NULL;}}free(*p);*p = NULL;}
}//用随机数填充二维数组(矩阵)
template<typename T, typename V>
bool generateNNumbers2D(T **a, int rows, int cols, V minValue, V maxValue)
{//assert(a != NULL && rows > 0 && cols > 0);if (a == NULL || rows < 1 && cols < 1) return false;if (minValue > maxValue) swap(minValue, maxValue);const int N = 999999;srand((unsigned)time(NULL));for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){a[i][j] = rand() % (int)(maxValue - minValue + 1) + minValue + rand() % (N + 1) / (float)(N + 1);}}return true;
}template<typename T>
void displayArray2D(T **a, const int rows, const int cols)
{assert(a != NULL && rows > 0 && cols > 0);for (int i = 0; i < rows; i++){printf("%d: ", i + 1);for (int j = 0; j < cols; j++){if (sizeof(T) == 1) cout << (int)a[i][j] << " ";else cout << a[i][j] << " ";}cout << endl;}
}template<typename T>
void displayMaxSubMatrix2D(T **mat, int leftTopRow, int leftTopCol, int rightBottomRow, int rightBottomCol)
{int row, col;for (row = leftTopRow; row <= rightBottomRow; row++){for (col = leftTopCol; col <= rightBottomCol; col++){if (sizeof(T) == 1) cout << (int)mat[row][col] << " ";else cout << mat[row][col] << " ";}cout << endl;}
}//求最大子矩阵,即该子矩阵的所有元素之和是所有子矩阵中最大的
void main(void)
{int ROW, COL;char **mat = NULL;	//可以改成其他类型,如int **mat; float **mat; char **mat;long double max, sum;int i, j, m, n, row, col;int leftTopRow, leftTopCol, rightBottomRow, rightBottomCol;bool isDataAutoGenerate;char ch;char buf[256];cout << "自动生成矩阵吗(y/Y:是):";cin >> ch;isDataAutoGenerate = (ch == 'y' || ch == 'Y');//清空输入缓冲区,如果你输入的东西很长,缓冲区依然残留数据,导致cin >> order//得到脏数据,程序的行为可能就不是你所预期的了。cin.getline(buf, sizeof(buf));	//这里默认矩阵行列相同,当然你可以改成行列可以取任意值的情况cout << "请输入矩阵的行数和列数:";while (cin >> ROW && cin >> COL){if (ROW < 1 || COL < 1){	cout << "矩阵的行数和列数均不能小于1哦." << endl;break;}/*mat = new int*[ROW];memset(mat, 0, sizeof(*mat) * ROW);for (i = 0; i < ROW; i++) mat[i] = new int[COL];*/allocateMemory2D(&mat, ROW, COL);if (isDataAutoGenerate){generateNNumbers2D(mat, ROW, COL, -100, 100);cout << "自动生成的" << ROW << "行," <<COL << "列矩阵为:" << endl;displayArray2D(mat, ROW, COL);}else{cout << "依次输入矩阵的每一个元素:\n";/*for (i = 0; i < ROW * COL; i++) cin >> mat[i / ROW][i % COL];*/for (i = 0; i < ROW; i++)for (j = 0; j < COL; j++)cin >> mat[i][j];}max = LONG_MIN;sum = 0;for (i = 1; i <= ROW; i++){for (j = 1; j <= COL; j++){for (m = 0; m <= ROW - i; m++){for (n = 0; n <= COL - j; n++){sum = 0;for (row = m; row < m + i; row++){for (col = n; col < n + j; col++){sum += mat[row][col];}}if (sum > max){leftTopRow = m;leftTopCol = n;rightBottomRow = row - 1;rightBottomCol = col - 1;max = sum;}}}}}/*for (i = 0; i < ROW; i++) if (mat[i]) delete mat[i];if (mat) delete[] mat;*/cout << "连续的最大子矩阵和为:" << max << endl;cout << "(" << leftTopRow << ", " << leftTopCol << "), " \<< "(" << rightBottomRow << ", " << rightBottomCol << ")" << endl;cout << "连续的最大子矩阵为:" << endl;displayMaxSubMatrix2D(mat, leftTopRow, leftTopCol, rightBottomRow, rightBottomCol);cout << endl;freeMemory2D(&mat, ROW);cout << "请输入矩阵的行数和列数:";}
}





相关文章:

tcpdump抓包文件提取http附加资源

2019独角兽企业重金招聘Python工程师标准>>> 前面几篇文章铺垫了一大批的协议讲解&#xff0c;主要是为了提取pcap文件中http协议附加的资源。 1、解析pcap文件&#xff0c;分为文件格式头&#xff0c;后面就是数据包头和包数据了 2、分析每个包数据&#xff0c;数据…

smobiler介绍(二)

类似开发WinForm的方式&#xff0c;使用C#开发Android和IOS的移动应用&#xff1f;听起来感觉不可思议&#xff0c;那么Smobiler平台到底是如何实现的呢&#xff0c;这里给大家介绍一下。客户端Smobiler分为两种客户端&#xff0c;一种是开发版&#xff0c;一种是打包版开发版&…

Matplotlib基本用法

Matplotlib Matplotlib 是Python中类似 MATLAB 的绘图工具&#xff0c;熟悉 MATLAB 也可以很快的上手 Matplotlib。 1. 认识Matploblib 1.1 Figure 在任何绘图之前&#xff0c;我们需要一个Figure对象&#xff0c;可以理解成我们需要一张画板才能开始绘图。 import matplot…

HDU1201 18岁生日【日期计算】

18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 32851 Accepted Submission(s): 10649Problem DescriptionGardon的18岁生日就要到了&#xff0c;他当然很开心&#xff0c;可是他突然想到一个问题&am…

TypeScript 从听说到入门(上篇)

我为什么会这样念念又不忘 / 你用什么牌的箭刺穿我心脏 我也久经沙场 / 戎马生涯 / 依然 / 被一箭刺伤 ——李荣浩《念念又不忘》 接下来我会分上、下两篇文章介绍 TypeScript。 我也是 TypeScript 初学者&#xff0c;这两篇文章是我的学习笔记&#xff0c;来源于一个系列的免费…

SLAM前端中的视觉里程计和回环检测

1. 通常的惯例是把 VSLAM 分为前端和后端。前端为视觉里程计和回环检测&#xff0c;相当于是对图像数据进行关联&#xff1b;后端是对前端输出的结果进行优化&#xff0c;利用滤波或非线性优化理论&#xff0c;得到最优的位姿估计和全局一致性地图。 1 前端&#xff1a;图像数…

粗心导致的bug

不管是调试程序还是直接看输出i都为2&#xff0c;下面是运行时输出的&#xff1a; 用vs2010以前遇到更奇葩的事&#xff0c;这次用vs2013也是遇到奇葩&#xff0c;taskNumber值为2一定&#xff0c;下面两个循环体&#xff0c;每个循环体各执行一次&#xff0c;程序输出i 2真是…

gearman中任务的优先级和返回状态

gearman中任务的优先级和返回状态 一、任务的优先级 同步阻塞调用&#xff0c;等待返回结果 doLow:最低优先 doNomal:正常优先级 doHigh:最优先执行 异步派发任务&#xff0c;不等待返回结果&#xff0c;返回任务句柄&#xff0c;通过该句柄可获取任务运行状态信息 doLowBackgr…

VMware学习使用笔记

本人在学习基础上&#xff0c;结合实际项目实现总结的笔记。以下内容都是基于VMware vSphere 6.7的官方文档中vSAN的规划和部署而来&#xff0c;网址https://docs.vmware.com/cn/VMware-vSphere/index.html。 对于ESXi系统 对于内存不足512G&#xff0c;可以从USB或Micro SD引导…

【原】Java学习笔记020 - 面向对象

1 package cn.temptation;2 3 public class Sample01 {4 public static void main(String[] args) {5 // 成员方法的参数列表&#xff1a;6 // 1、参数列表中的数据类型是值类型7 // 2、参数列表中的数据类型是引用类型8 // A&#xff1a;…

win32 wmi编程获取系统信息

//GetSysInfo.h#pragma once#include <afxtempl.h>class GetSysInfo { public:GetSysInfo(void);~GetSysInfo(void);public: /********获取操作系统版本&#xff0c;Service pack版本、系统类型************/ void GetOSVersion(CString &strOSVersion,CString &…

cmake 注意事项

1. add_subdirectory()调用 CMake将在每次add_subdirectory()调用时创建一个新的变量作用域,因此这个参数最好的用法是放在cmaklists的最后使用&#xff0c;这样的话创建的新的变量的作用范围与内存的变化就不会影响到后面的变量的使用。 查看并打印在cmake里面定义的宏在&am…

Jmeter 使用自定义变量

有些情况下比如发起测试时URL的主机名和端口需要在采样器中出现多次&#xff0c;这样就有个问题&#xff0c;当测试的主机更改时&#xff0c; 我们需要修改主机名称&#xff0c;这时就需要修改多个地方&#xff0c;如果多的情况会有遗漏。如果我们在配置脚本的时候&#xff0c;…

Kubernetes1.5源码分析(二) apiServer之资源注册

源码版本 Kubernetes v1.5.0 简介 k8s里面有各种资源&#xff0c;如Pod、Service、RC、namespaces等资源&#xff0c;用户操作的其实也就是这一大堆资源。但这些资源并不是杂乱无章的&#xff0c;使用了GroupVersion的方式组织在一起。每一种资源都属于一个Group&#xff0c;而…

opencv3 视频稳像

OpneCV3.x中提供了专门应用于视频稳像技术的模块&#xff0c;该模块包含一系列用于全局运动图像估计的函数和类。结构体videostab::RansacParams实现了RANSAC算法&#xff0c;这个算法用来实现连续帧间的运动估计。videostab::MotionEstimatorBase是基类中所有全局运动估计方法…

perf+火焰图 = 性能分析利器

perf 1. perf安装 sudo apt install linux-tools-common检查是否安装好 perf如果出现 You may need to install the following packages for this specific kernel:推荐安装可以按照提示将推荐安装包全部安装好 sudo apt-get install linux-tools-对应版本-generic linux-c…

3- MySQL数据类型

MySQL表字段类型 MySQL数据表的表示一个二维表&#xff0c;由一个或多个数据列构成。 每个数据列都有它的特定类型&#xff0c;该类型决定了MySQL如何看待该列数据&#xff0c;并且约束列存放相应类型的数据。 MySQL中的列表有三种&#xff1a;数值类&#xff0c;字符串类和日期…

AddressSanitizer+cmake

1. AddressSanitizercmake(Linux) 编译指令&#xff1a; CXXFLAGS通常需要加上 -fsanitizeaddress -fno-omit-frame-pointer #打印函数调用路径 -fsanitize-recoveraddress #AddressSanitizer遇到错误时能够继续-fsanitizeaddress-fno-omit-frame-pointer-fsanitize-rec…

vibe前景提取改进算法

// improveVibeAlgorithm.h #ifndef IMPROVED_VIBE_ALGORITHM_H #define IMPROVED_VIBE_ALGORITHM_H#include <opencv2/opencv.hpp> using namespace std;#define WINSIZE 5 // Vibe改进算法, Barnich, Olivier & Droogenbroeck, Marc. (2009). // ViBE: A powerfu…

npm-debug.log文件出现原因

项目主目录下总是会出现这个文件&#xff0c;而且不止一个&#xff0c;原因是npm i 的时候&#xff0c;如果报错&#xff0c;就会增加一个此文件来显示报错信息&#xff0c;npm install的时候则不会出现。转载于:https://www.cnblogs.com/liuna/p/6558006.html

AutoFac Ioc依赖注入容器

本文原著&#xff1a;牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图&#xff1a; 没有使用IOC容器的情况下: 使用IOC容器的情况下&#xff1a; 去掉IOC容器的情况后&#xff1a; IOC容器又像一个插座&#xff0c;将电输送…

Linux安装App记录

Ubuntu18.04安装微信

windows socket编程入门示例3

// Lock.h #ifndef _Lock_H #define _Lock_H #include <windows.h>class CriticalSection { private:CRITICAL_SECTION g_cs; //临界区 public:CriticalSection();~CriticalSection();void Lock();void UnLock(); }; #endif// Lock.cpp #include "Lock.h"…

游戏开发:js实现简单的板球游戏

js实现简单的板球游戏大家好&#xff0c;本次我们来使用js来实现一个简单的板球游戏。截图如下&#xff1a;首先&#xff0c;设计页面代码&#xff0c;页面代码很简单&#xff0c;因为整个几乎是使用js编写的&#xff0c;页面几乎没有代码&#xff0c;如下&#xff1a;<!DOC…

SLAM精度测评——EVO进阶

1. 基本概念 1.1 Umeyama算法 ATE&#xff1a; evo_ape tum state_groundtruth_estimate0/data.tum orb2/CameraTrajectory.txt -r trans_part -va --plot --plot_mode xy --save_results /home/sun/evo/v1_01_easy/orb2/ate.zip RPE&#xff1a; evo_rpe tum state_groun…

python读取图片并且显示

使用python-opencv读取图片&#xff0c;利用opencv或matplotlib显示图片。 # -*- coding: utf-8 -*-import numpy as np from matplotlib import pyplot as plt #import urllib import cv2def load_image1(file):# Load an color image in grayscaleimg cv2.imread(file,0)cv…

shiro认证

shiro权限认证&#xff1a; 具体的认证流程是这样的&#xff1a; 一般流程&#xff1a; 通过.ini的文件来初始化工厂&#xff0c;.ini的文件的好处是可以创建多个组&#xff0c;而.properties的文件只能创建一组。 系统默认有shiro.ini的文件&#xff0c;但是一般我们是自定义数…

小猿圈Linux基础面试题,看看你能答对几道?

最近身边的很多朋友都在学习linux&#xff0c;从最开始的安装软件都需要百度一天的他们&#xff0c;现在已经成长为了&#xff0c;不需要百度就可以把自己弄懵圈的了&#xff0c;接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分析给大家&#xff0c;希望对你有所…

ORB-SLAM2 论文翻译

https://ug98gs7tbw.feishu.cn/docs/doccnKKOWAjkKv7AzAiEvbnM3Tf

mxnet教程1

import mxnet as mx #%matplotlib inline import os import subprocess import numpy as np import matplotlib.pyplot as plt import tarfileimport warnings warnings.filterwarnings("ignore", categoryDeprecationWarning)# 从内存中读取数据 def test1():data …