本随笔只由于时间原因,我就只写写思想了
 
二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想
一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了

我们有一个最初的二维数组a[n][m],找它的 最大子数组之和

1.我们先建立一个新的二维数组b[n][m]

二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0]  的最大值

2。循环:从a[0][0]开始 以此是 a[0][1]、 a[0][2]……a[0][m]、
                                          a[1][0]、 a[1][1]……a[1][m]、

a[2][0]、 a[2][1]……a[2][m]、

……

a[n][0]、 a[n][1]……a[n][m]、

具体循环工作:

当循环到a[j][k](0<=j<n,0<=k<m)

则求的是 a[j][k]到 a[0][0]  的最大值

计算方法:

b[j][k]=a[j][k]+b[j-1][k]+b[j][k-1]-b[j-1][k-1]

若b[j][k]<0,则赋值为0;

每次计算完成后,都需要与max进行比较

当然:  二位数组边缘部分循环时需要稍做调整

当然部分细节也没说到,留给大家自己考虑

  1. #include<iostream.h>
  2. int main()
  3. {
  4. int i,j;
  5. int a[3][3]={-1,-2,1,-3,4,2,3,4,-5};
  6. int b[3][3];
  7. int max=a[0][0];
  8. for(i=0;i<3;i++)
  9. {
  10. for(j=0;j<3;j++)
  11. {
  12. cout<<a[i][j]<<' ';
  13. }
  14. cout<<endl;
  15. }
  16. for(i=0;i<1;i++)
  17. {
  18. b[0][0]=a[0][0];
  19. for(j=0;j<3;j++)
  20. {
  21. if(a[0][j-1]<0)
  22. {
  23. b[0][j]=a[0][j];
  24. }
  25. else
  26. {
  27. b[0][j]=b[0][j-1]+a[0][j];
  28. }
  29. }
  30. }
  31. for(i=1;i<3;i++)
  32. {
  33. for(j=0;j<1;j++)
  34. {
  35. if(a[i-1][0]<0)
  36. {
  37. b[i][0]=a[i][0];
  38. }
  39. else
  40. {
  41. b[i][0]=b[i-1][0]+a[i][0];
  42. }
  43. }
  44. }
  45. for(i=1;i<3;i++)
  46. {
  47. for(j=1;j<3;j++)
  48. {
  49. if(b[i-1][j-1]<0)
  50. {
  51. if(b[i-1][j]>=0&&b[i][j-1]>=0)
  52. {
  53. if(b[i][j-1]>=b[i-1][j])
  54. {
  55. b[i][j]=b[i][j-1]+a[i][j];
  56. }
  57. else
  58. {
  59. b[i][j]=b[i-1][j]+a[i][j];
  60. }
  61. }
  62. else if(b[i-1][j]>=0&&b[i][j-1]<=0)
  63. {
  64. b[i][j]=b[i-1][j]+a[i][j];
  65. }
  66. else if(b[i-1][j]<=0&&b[i][j-1]>=0)
  67. {
  68. b[i][j]=b[i][j-1]+a[i][j];
  69. }
  70. else
  71. {
  72. b[i][j]=a[i][j];
  73. }
  74. }
  75. else
  76. {
  77. if(b[i-1][j]>=0&&b[i][j-1]>=0)
  78. {
  79. b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
  80. }
  81. else if(b[i-1][j]>=0&&b[i][j-1]<=0)
  82. {
  83. b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
  84. }
  85. else if(b[i-1][j]<=0&&b[i][j-1]>=0)
  86. {
  87. b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
  88. }
  89. else
  90. {
  91. b[i][j]=a[i][j];
  92. }
  93. }
  94. }
  95. }
  96. for(i=0;i<3;i++)
  97. {
  98. for(j=0;j<3;j++)
  99. {
  100. cout<<b[i][j]<<" ";
  101. }
  102. cout<<endl;
  103. }
  104. for(i=0;i<3;i++)
  105. {
  106. for(j=0;j<3;j++)
  107. {
  108. if(b[i][j]>max)
  109. max=b[i][j];
  110. }
  111. }
  112. cout<<"max="<<max<<endl;
  113. return 0;
  114. }

完成者: 信1205 李志岩

信1205 张新宇

求一个二维整数数组最大子数组之和,时间复杂度为N^2的更多相关文章

  1. 计算机二级-C语言-程序设计题-190119记录-求出一个二维数组每一列的最小值。

    //编写一个函数:tt指向一个M行N列的二维数组,求出二维数组每列中最小的元素,并依次放入pp所指的一维数组中.二维数组中的数在主函数中赋予. //重难点:求出的是每一列的最小值,这里要注意,学会简化 ...

  2. 如何用一个for循环打印出一个二维数组

    思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...

  3. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  4. [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组

    13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...

  5. new一个二维数组

    .定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...

  6. c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

    //题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...

  7. poj2155一个二维树状数组

                                                                                                         ...

  8. php中向前台js中传送一个二维数组

    在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...

  9. JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数

    JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...

随机推荐

  1. 博客搬到CSDN了

    新博客地址: http://blog.csdn.net/enlangs

  2. layout_weight相关知识

    之前使用layout_weight都是在layout_width或layout_height为0dp的时候,都没出现什么问题,但是无意间看到了如果设为match_parent会出现不同效果记录一下. ...

  3. 利用sub lr,lr,#4:程序是如何进行返回的?

    1: ARM采用的是3级流水线 ARM的流水线结构为:   取指 -----> 译码 ------> 执行 ARM代码:                  PC           PC- ...

  4. AM335X开发板学习系列——环境搭建(vbox虚拟机ubuntu14.04下minicom的安装和配置)

    这个系列是我学习AM335X的总结. 1. ubuntu虚拟机的USB设备,选择启用usbserial 2. ubuntu虚拟机的网络,采用桥接模式,以保证开发板和ubuntu虚拟机能互相ping通 ...

  5. sublime前端开发工具常用技巧

    ctrl+N//新建文件夹ctrl+shift+p//打开命令行!,ctrl+E//快速生成html模板ctrl+E//自动补齐ctrl+P(#@)//goto 任何地方,其中#查找元素,@查找样式c ...

  6. Golang分布式爬虫:抓取煎蛋文章|Redis/Mysql|56,961 篇文章

    --- layout: post title: "Golang分布式爬虫:抓取煎蛋文章" date: 2017-04-15 author: hunterhug categories ...

  7. 自动化构建工具gulp简单介绍及使用

    一.简介及安装: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快 ...

  8. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  9. sql中的复制函数REPLICATE

    REPLICATE函数: REPLICATE(字符串,次数)复制一个字符串n次 ) --输出结果:0000000000

  10. (转)使用string.Format需要注意的一个性能问题

    今天,我在写C#代码时,突然发现一个最熟悉的陌生人 —— string.Format.在写C#代码的日子里,与它朝夕相伴,却没有真正去了解它.只知道在字符串比较多时,用它比用加号进行字符串连接效率更高 ...