数组03

一、题目

  返回一个二维整数数组中最大子数组的和。

二、要求

  输入一个二维整型数组,数组里有正数也有负数。

  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  求所有子数组的和的最大值。

三、设计思想

  本次数组03实验是在上次实验的基础上,利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。这样的缺陷是时间花费比较多,而且没有用文件来实现,只是实现在程序中输入输出。

四、源代码

  1 //数组03
  2 //胡浩特、朱子嘉 2016/3/28
  3
  4 #include <iostream>
  5 using namespace std;
  6
  7 int maxSubArray(int **a, int n, int m)
  8 {
  9     int **p = new int*[n];
 10     int i, j;
 11     if (m == 0 || n == 0)
 12         return 0;
 13     //计算p[i][j]
 14     for (i = 0; i<n; i++)
 15     {
 16         p[i] = new int[m];
 17         for (j = 0; j<m; j++)
 18         {
 19             if (i == 0)
 20             {
 21                 if (j == 0)
 22                     p[i][j] = a[i][j];
 23                 else
 24                     p[i][j] = p[i][j - 1] + a[i][j];
 25             }
 26             else
 27             {
 28                 if (j == 0)
 29                     p[i][j] = p[i - 1][j] + a[i][j];
 30                 else
 31                     p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j];
 32             }
 33         }
 34     }
 35     //计算二维数组最大子数组的和
 36     int temp;
 37     int max = a[0][0];//初始化
 38     int sum = a[0][0];
 39     if (m == 1)
 40     {
 41         for (i = 0; i<n; i++)
 42         {
 43             for (j = i; j<n; j++)
 44             {
 45                 if (i == 0)
 46                 {
 47                     temp = p[j][m - 1];
 48                 }
 49                 else
 50                 {
 51                     temp = p[j][m - 1] - p[i - 1][m - 1];
 52                 }
 53                 if (sum<temp)
 54                     sum = temp;
 55             }
 56         }
 57     }
 58     else
 59     {
 60         for (i = 0; i<n; i++)
 61         {
 62             for (j = i; j<n; j++)
 63             {
 64                 if (i == 0)
 65                 {
 66                     temp = p[j][m - 1] - p[j][m - 2];
 67                 }
 68                 else
 69                 {
 70                     temp = p[j][m - 1] - p[j][m - 2] - p[i - 1][m - 1] + p[i - 1][m - 2];
 71                 }
 72                 for (int k = m - 2; k >= 0; k--)
 73                 {
 74                     if (temp<0)
 75                         temp = 0;
 76                     if (i == 0)
 77                     {
 78                         if (k == 0)
 79                             temp += p[j][k];
 80                         else
 81                             temp += p[j][k] - p[j][k - 1];
 82                     }
 83                     else
 84                     {
 85                         if (k == 0)
 86                             temp += p[j][k] - p[i - 1][k];
 87                         else
 88                             temp += p[j][k] - p[j][k - 1] - p[i - 1][k] + p[i - 1][k - 1];
 89                     }
 90                     if (sum<temp)
 91                         sum = temp;
 92                 }
 93             }
 94         }
 95     }
 96     return sum;
 97 }
 98
 99 int main()
100 {
101     int n;//行数
102     int m;//列数
103
104     cout << "请输入二维数组的行数:" << endl;
105     cin >> n;
106     cout << "请输入二维数组的列数:" << endl;
107     cin >> m;
108
109     int i, j;
110     int **a = new int*[n];
111     cout << "请输入该二维数组元素:" << endl;
112     for (i = 0; i<n; i++)
113     {
114         a[i] = new int[m];
115
116         for (j = 0; j<m; j++)
117         {
118             cin >> a[i][j];
119         }
120     }
121     int sum;//最大字数组的和
122     sum = maxSubArray(a, n, m);
123     cout << "二维数组的最大子数组之和:" << sum << endl;
124     return 0;
125 }

五、实验结果

六、实验总结

  本次实验的算法不够简洁,希望可以找到更加高效的算法,而且没有实现从txt文件中读入二维数组的数值,希望以后可以改进,这次实验虽然不难,但也学到了不少知识,以及如何把二维数组降维成一维数组。

时间: 2024-10-23 16:39:48

数组03的相关文章

数组-03. 冒泡法排序

数组-03. 冒泡法排序(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的元素.然后用同样的方法对前N-1个元素进行第二遍扫描.依此类推,最后只需处理两个元素,就完成了对N个数的排序. 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间

数组-03. 冒泡法排序(20)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int i,j,n,k,a[100],tmp; 5 cin>>n>>k; 6 for(i=0;i<n;++i) 7 cin>>a[i]; 8 for(j=0;j<k;++j) 9 for(i=0;i<n-j-1;++i) //注意-1 10 if(a[i]>a[i+1]){ 11 tmp=a[i]; 12 a[i]=

求最大子数组03

题目: 返回一个二维整数数组中最大联通子数组的和. 要求: 1. 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 代码: #include<iostream> #include<fstream> using namespace std

记linux shell的两个小技巧:shell数组和字符串判断

最近在使用shell写脚本的时候,想实现python中两个很简单的功能:1:判断一个字符串是否包含另一个字符串.2:怎么用实现python的列表功:1.这里跟大家分享一下. 1:判断一个字符串是否包含另一个字符串: string="abcdefg" if [[ "$string" =~ "abc" ]];then   echo "do something.." else   echo "nothing.."

我们曾经心碎的C#之 第三章.如何使用C#属性

第三章 . 如何使用C#属性 1.Private访问修饰符   访问修饰符可以用来修饰类成员字段和方法,每个访问修饰符只能为紧随其后的成员指定特定的访问权限 如果将字段或方法声明为public 就表示其他类可以访问这个字段或方法 如果为private那么该字段或方法只能在本类中使用,其他类不能访问  故对该内容有保护权限,但可以借助第三方对该内容修改 示例如下:借助带参数的声明为public的方法来传入参数进而对私有字段进行修改 定义一个dog类 姓名声明为private  然后定义一个publ

【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Hashtable介绍第2部分 Hashtable数据结构第3部分 Hashtable源码解析(基于JDK1.6.0_45)第4部分 Hashtable遍历方式第5部分 Hashtable示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3310887.h

深入Java集合学习系列:Hashtable的实现原理

第1部分 Hashtable介绍 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射.Hashtable 继承于Dictionary,实现了Map.Cloneable.java.io.Serializable接口.Hashtabl 的函数都是同步的,这意味着它是线程安全的.它的key.value都不可以为null.此外,Hashtable中的映射不是有序的.Hashtable 的实例有两个参数影响其性能:初始容量 和 加载因子. 容量 是哈希

分享一套C++入门基础视频

本课程从C++起步.用户无需任何计算机基础,只需要懂的基本的电脑操作,既可学习本课程,本课程适合在校大学生,在职人员等,通过本课程的学习,学员可掌握C++\MFC\VC++服务器端.网络编程等技能,相比国内几万的培训费,可谓实惠多多. 后续还有关于MFC.数据库编程.XML编程.网络编程等内容.有时间慢慢发上来 学习对象 1:有志于在软件开发.服务器端开发.VC++游戏开发领域寻求发展的人员 2:专业零起点 3:无需任何C语言基础,适合学历高中起点即可 4:具备基本的计算机操作.英语阅读能力 学

java集合11--HashTable源码详解

概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习. 我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable. 第1部分 Hashtable介绍 第2部分 Hashtable数据结构 第3部分 Hashtable源码解析(基于JDK1.6.0_45) 第4部分 Hashtable遍历方式 第5部分 Hashtable示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/331