#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 << "请输入矩阵的行数和列数:";}
}



												

求一个矩阵的最大子矩阵相关推荐

  1. 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)

    一,题目: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3) ...

  2. C语言每日一练——第10天:求一个矩阵主对角线及副对角线元素之和

    C语言每日一练 2021年9月18日 题目描述 求一个矩阵主对角线及副对角线元素之和 分析 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,矩阵是高等代数学中的常见工具,也常见于 ...

  3. 求一个矩阵的鞍点(即在行上最小而在列上最大的值)(C++编写)(循环与递归)

    算法经典题型1 求一个矩阵的鞍点(即在行上最小而在列上最大的值) 用到的算法 思想是 -循环与递归 博主用到的环境:Win7, CodeBlocks等. 一.代码 #include <iostr ...

  4. matlab矩阵绝对值,matlab怎么求一个矩阵所有元素的绝对值之和,看完就明白了

    有时候我们在使用matlab的时候,想求一个矩阵所有元素的绝对值之和,怎么求呢,下面来分享一下方法 工具/材料 matlab 求矩阵所有元素的绝对值之和 操作方法 01 第一步在我们的电脑上打开mat ...

  5. 求一个矩阵中的马鞍点(c语言实现)

    数据结构中的求一个矩阵的马鞍点 请编写一个完整的程序,如果矩阵A中存在这样的一个元素A[i,j]满足条件A[i,j]是第i行的值最小的元素,且又是第j列中最大的元素,则称之为该矩阵的一个马鞍点. 代码 ...

  6. 求整形矩阵的最大子矩阵

    1求整形矩阵的最大和子矩阵 具体问题 给你一个N×N的数组,请你找出有最大和的子区域,其和为多少.一个区域的和指的是该区域中所有元素值的和.一个区域是指相连的任意大小的子数组.例如,对以下的二维数组, ...

  7. python 求一个矩阵的距离矩阵的方法:

    例:有行向量矩阵Matrix,维度为(n行,d特征长).我们要求个点之间的距离并构成一个(n,n)距离矩阵,方法如下: 主要用到: np.square(), np.add(a,b), #若b为行向量, ...

  8. matlab求矩阵均值向量,如何求一个矩阵的均值向量

    四.线性方程组 考试内容 线性方程组的克莱姆(Cramer)法则 线性方程组有解和无解的判定齐次线性方程组的基础解系和通解非齐次线性方程组的解与相应的齐次线性方程组(导出组)的解之间的关系非齐次线性方 ...

  9. MATLAB中求一个矩阵的最大值或最小值的两种写法

    第一种写法: max_A = max(max(A)); min_B = min(min(B)); 注意,一定要是两层运算,如果只作一层运算,则结果是一个向量,向量中的元素是每一列的最小值或最大值. 第 ...

最新文章

  1. java实现具有修饰的完美圣诞树
  2. 过滤器(Filter)
  3. Spring boot定制错误页面
  4. 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接
  5. 深度学习优化算法总结
  6. Linux与时间相关的结构体及相关用法
  7. 用java处理图片(压缩成小尺寸;加文字和logo水印)
  8. 7.过渡案例:①进度条 ②小米图标翻转(父盒子一定要加初始值!!!)
  9. 台式计算机用什么电源线,台式电脑电源线接法图解(3分钟学会接电脑电源线)...
  10. 我要偷偷的学Python,然后惊呆所有人(最后一天)
  11. Effective Modern C++笔记汇总
  12. 应届毕业生面试软件测试...测试小白如何抓住机会
  13. mac 卸载php版本,mac 系统下删除旧的php版本安装最新的php版本及Xdebug
  14. TPO “Java运行环境未找到”
  15. Mirrored String I Gym - 101350H (水)判断回文
  16. GD32开发资料汇总下载软件硬件工具
  17. Android 打开第三方地图App进行导航
  18. 王者荣耀头像大小怎么调?调整图片尺寸大小工具分享
  19. css 高度随宽度比例变化
  20. 新发现的Web服务-----免费服务

热门文章

  1. 普通二叉树、二叉查找树、平衡二叉树常见操作汇总
  2. hung-yi lee_p15_机器学习深层网络比浅层网络好在哪
  3. beats x连android手机吗,beats x 能连安卓手机吗?
  4. 2.最详细的WSDD配置文件注释
  5. 利用.htaccess绑定子域名到子目录(亲测万网可用)
  6. javascript json对象转字符串形式
  7. [转载]分享WCF聊天程序--WCFChat
  8. Firebug Console 与命令行全集
  9. springDataJpa实现普通模糊查询
  10. 什么是JavaBean