任务:

(1)输入一个二维整形数组,数组里有正数也有负数。
(2)二维数组首尾相接,象个一条首尾相接带子一样。
(3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(4)求所有子数组的和的最大值。
1.设计思想:这个题目显然是结合了之前二维数组求最大子数组的和以及一维环形数组求最大连续子数组的和两个模块,所以只要将两个程序联合起来即可。首先将数组横向扩展一倍,将环转换为求一维连续的数组求最大子数组和。然后将二维数组转换为一维数组求和,即建立一个新的和数组,用来储存从数组的首个元素到当前位置元素的连续子数组的最大和,其中会用到一位数组求连续最大子数组程序中的部分代码。然后这个问题就可以被转化为求新的和数组中的最大元素了,就能很方便地求出最大子矩阵的和。
2.源代码:
  1. //二维环形数组求最大子矩阵
  2. //刘子晗 2015/4/22
  3.  
  4. #include<iostream>
  5. #include<time.h>
  6. using namespace std;
  7.  
  8. void main()
  9. {
  10. int m, n, a[][], b[][],i, j ;
  11. cout << "请输入矩阵的行数和列数:" << endl;
  12. cin >> m >> n;
  13. srand((unsigned)time(NULL));
    cout << "产生的随机数组为:" << endl;
  1. for (i = ; i < m; i++)
  2. {
  3. for (j = ; j < n; j++)
  4. {
  5. a[i][j] = rand() % - ;
  6. cout << a[i][j] << " ";
  7. }
  8. cout << endl;
  9. }//输出随机产生的矩阵
  10.  
  11. int max = a[][];
  12. for (i = ; i < m ; i++)
  13. {
  14. for (j = ; j < n; j++)
  15. {
  16. a[i][j + n] = a[i][j];
  17. }
  18. }//对二维数组进行扩展,横向延长一倍
  19.  
  20. cout << "扩展后环形数组为:" << endl;
  21. for (i = ; i < m; i++)
  22. {
  23. for (j = ; j < *n-; j++)
  24. {
  25. cout << a[i][j] << ' ';
  26. }
  27. cout << endl;
  28. }//输出扩展之后的新数组
  29.  
  30. for (i = ; i < ; i++)
  31. {
  32. b[][] = a[][];
  33. for (j = ; j < *n -; j++)
  34. {
  35. if (a[][j - ] < )
  36. {
  37. b[][j] = a[][j];
  38. }
  39. else
  40. {
  41. b[][j] = b[][j - ] + a[][j];
  42. }
  43. }
  44. }//对第一行的数作为一个数组求其最大连续子数组之和
  45.  
  46. for (i = ; i < m; i++)
  47. {
  48. for (j = ; j < ; j++)
  49. {
  50. if (a[i - ][] < )
  51. {
  52. b[i][] = a[i][];
  53. }
  54. else
  55. {
  56. b[i][] = b[i - ][] + a[i][];
  57. }
  58. }
  59. }//对第一列的数作为一个数组,求其连续子数组的最大和
  60.  
  61. for (i = ; i<m; i++)
  62. {
  63. for (j = ; j<*n-; j++)
  64. {
  65. if (b[i - ][j - ]<)
  66. {
  67. if (b[i - ][j] >= && b[i][j - ] >= )
  68. {
  69. if (b[i][j - ] >= b[i - ][j])
  70. {
  71. b[i][j] = b[i][j - ] + a[i][j];
  72. }
  73. else
  74. {
  75. b[i][j] = b[i - ][j] + a[i][j];
  76. }
  77. }
  78. else if (b[i - ][j] >= && b[i][j - ] <= )
  79. {
  80. b[i][j] = b[i - ][j] + a[i][j];
  81. }
  82. else if (b[i - ][j] <= && b[i][j - ] >= )
  83. {
  84. b[i][j] = b[i][j - ] + a[i][j];
  85. }
  86. else
  87. {
  88. b[i][j] = a[i][j];
  89. }
  90. }
  91. else
  92. {
  93. if (b[i - ][j] >= && b[i][j - ] >= )
  94. {
  95. b[i][j] = a[i][j] + b[i - ][j] + b[i][j - ] - b[i - ][j - ];
  96. }
  97. else if (b[i - ][j] >= && b[i][j - ] <= )
  98. {
  99. b[i][j] = a[i][j] + b[i - ][j] - b[i - ][j - ];
  100. }
  101. else if (b[i - ][j] <= && b[i][j - ] >= )
  102. {
  103. b[i][j] = a[i][j] + b[i][j - ] - b[i - ][j - ];
  104. }
  105. else
  106. {
  107. b[i][j] = a[i][j];
  108. }
  109. }
  110. }
  111. }//求整个矩阵中从首个元素到当前元素的数组和的最大值,并将该值赋给当前地址
  112.  
  113. cout << "子矩阵的和数组为:" << endl;
  114. for (i = ; i<m; i++)
  115. {
  116. for (j = ; j< * n - ; j++)
  117. {
  118. cout << b[i][j] << " ";
  119. }
  120. cout << endl;
  121. }//输出新生成的和数组
  122.  
  123. cout << endl;
  124. for (i = ; i<m; i++)
  125. {
  126. for (j = ; j< * n - ; j++)
  127. {
  128. if (b[i][j]>max)
  129. {
  130. max = b[i][j];
  131. }
  132.  
  133. }
  134. }//求数组中的最大元素
  135. cout << "最大子矩阵和为:" << max << endl;
  136. }

3.结果截图:

4.总结:(1)再一次感觉到拆分问题的重要性,无论题目有多复杂,当拥有可以拆分问题的能力的时候,一一击破然后再将其有机地组合起来,一切问题都会迎刃而解;

(2)题目在一步一步地增加难度的时候,如果能把之前的每个相对简单的程序都弄明白之后,组合成的难题反而却是非常简单的。所以每次完成一个程序一定要完全把它想清楚,非以方便以后去使用其中的内容和思想;

(3)要善于总结,每一次总结回顾总能发现不一样的问题,得到不一样的体会。

Task 4.4二维环形数组求最大子矩阵之和的更多相关文章

  1. Codeforces Round #369 (Div. 2) A. Bus to Udayland【字符串/二维字符数组求连起来的座位并改为其他字符】

    A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理

    //给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...

  3. PHP二维关联数组的遍历方式

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...

  4. C++ 指针二维数组, C++二维指针数组笔记

    C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...

  5. 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛

    子串查询 Time Limit: 3500/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  6. 二维字符数组利用gets()函数输入

    举例: ][]; ;i<;i++) gets(a[i]); a是二维字符数组的数组名,相当于一维数组的指针, 所以a[i]就相当于指向第i个数组的指针,类型就相当于char *,相当于字符串.

  7. 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector

    先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...

  8. go 动态数组 二维动态数组

    go使用动态数组还有点麻烦,比python麻烦一点,需要先定义. 动态数组申明 var dynaArr []string 动态数组添加成员 dynaArr = append(dynaArr, &quo ...

  9. 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参

    [问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...

随机推荐

  1. 【VSC】我安装了哪些扩展插件

    Nodejs gitk  ——  版本实时比对 Debugger for Chrome ——  让 vscode 映射 chrome 的 debug功能,静态页面都可以用 vscode 来打断点调试. ...

  2. fio是如何运行的?

    本文主要介绍fio是如何运行的,并且以单线程.单job为例 fio的入口在fio.c中的main函数,下面列出了main函数,此处只出示了一些调用的关键函数 int main(int argc, ch ...

  3. dataTable配置项说明

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官网地址:https://datatables.net/ 中文说明地址:http:/ ...

  4. Linux服务-ftp

    目录 1. ftp简介 2. ftp架构 3. ftp数据连接模式 4. 用户认证 5. vsftpd 5.1 vsftpd安装 5.2 vsftpd配置 5.3 vsftpd实验配置 5.3.1 安 ...

  5. 用NI的数据采集卡实现简单电子测试之4——半导体温度传感器

    本文从本人的163博客搬迁至此. 为了展示NImax(Measurement & Automation explorer)的强大配置功能,做了一个半导体温度传感器测试的示例. 一.半导体温度传 ...

  6. IceStorm示例运行步骤

    又一次忘了,记下: 1.启动IceStorm服务,输入:icebox --Ice.Config=config.icebox 启动IceStorm服务.2.消息接收:开启另一个命令行窗口,Subscri ...

  7. 生死系列--SongXingZhi

    SongXingZhi,我上中专时的同学,任劳动委员,湖北随州人.其实在上学以及毕业后,我们俩没什么交往,也没说过几句话. 印象比较深的一次是在上什么课时,老师拖堂了 ,他直接从课桌上翻过来,从后门出 ...

  8. JavaWeb基础——JSON

    一.JSON是什么? JSON(JavaScript Object Notation).轻量级数据交换格式. JSON的后缀名:.json JSON的MINE类型:application/json 二 ...

  9. JavaScript总结(四)

    详解BOM(浏览器对象模型(Browser Object Model)) ✍ Window对象方法 方法 描述 alert() 显示带有一段消息和一个确认按钮的警告框 blur() 把键盘焦点从顶层窗 ...

  10. 【HNOI2013】数列

    题面 题解 设\(\{a_n\}\)为差分数组,可以得到柿子: \[ \begin{aligned} ans &= \sum_{a_1 = 1} ^ m \sum_{a_2 = 1} ^ m ...