最大联通子数组的和

最大联通子数组的和

 在几次“迭代”开发数组的项目之后老师又布置了这个“联通数组”的任务,当然,此次任务依旧是“结对编程”,要求如下:

1、题目:返回一个二维数整数组中最大联通子数组的和;

2、数组中有正数,也有负数;

3、求所有子数组的最大值,要求时间复杂度为O(n);

4、程序要使用的数组放在input.txt文件中,文件的格式:行数,列数,每一行的元素;


 

一、实验思路 

      数组的行和列和数组元素又文件读入,然后把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括。最后在加上没有包括的正数(必须在上一行的最大连续数组的第一位和最后一位的位置之间),输出之前加和。

二、实验代码及实现

代码如下:

  1 //2016/4/1 求最大联通子数组的和——赵子茵&孔宇航
  2 
  3 #include<iostream>
  4 #include<fstream>
  5 using namespace std;
  6 
  7 int Max(int n, int arr[], int *Start_mark, int *Final_mark)
  8 {
  9     int step[100] = { 0 };//Step记录每步计算子数组的和
 10     int i, sum = 0, max1 = 0;
 11     /* sum是子数组的和
 12        max1是子数组最大和
 13     */
 14     for (i = 0; i<n; i++)
 15     {
 16         if (sum<0)
 17             sum = arr[i];
 18         else
 19             sum = sum + arr[i];
 20         step[i] = sum;
 21     }
 22     max1 = step[0];
 23     for (i = 0; i<n; i++)
 24     {
 25         if (max1<step[i])
 26         {
 27             max1 = step[i];
 28             *Final_mark = i;
 29         }
 30     }
 31     for (i = *Final_mark; i >= 0; i--)
 32     {
 33         if (step[i] == arr[i])
 34         {
 35             *Start_mark = i;
 36             break;
 37         }
 38     }
 39     return max1;
 40 }
 41 
 42 void main()
 43 {
 44     int m, n, i, j, Start_mark, Final_mark, big;
 45     int Max1;
 46     int read[10000];//读取文件的字符集
 47     int up[100], down[100], h[100];
 48     int Arr2[100][100], Arr1[100];
 49     /* m行n列的数组
 50        Start_mark表示最大子数组的起始坐标
 51        Final_mark表示最大子数组的终止坐标
 52        big表示最后输出的最大联通子数组和
 53        Max1是函数返回的一维数组最大子数组和
 54        up存放每行最大子数组起始坐标
 55        down存放每行最大子数组终止坐标
 56        h存放每行最大子数组的和
 57        Arr2存放二维数组
 58        Arr1存放拆成的一维数组
 59     */
 60 
 61     /*cout << "请输入二维数组的行数和列数:";
 62     cin >> m >> n;
 63     cout << "请输入这个二维矩阵:" << endl;
 64     for (i = 0; i<m; i++)
 65     {
 66         for (j = 0; j<n; j++)
 67         {
 68             cin >> a[i][j];
 69         }
 70     }*/
 71 
 72     //文件输入
 73     ifstream infile("input.txt", ios::in);
 74     if (infile.is_open() == false)
 75     {
 76         cerr << "open error!" << endl;
 77         exit(1);
 78     }
 79     infile >> read[0];//读取行数m
 80     m = read[0];
 81     infile >> read[1];//读取列数n
 82     n = read[1];
 83     cout << "指定文件中" << read[0] << "" << read[1] << "列的二维数组如下:" << endl;
 84     for (i = 0; i < m; i++)//读取数组并按格式输出
 85     {
 86         for (j = 0; j < n; j++)
 87         {
 88             infile >> read[i + 2];
 89             Arr2[i][j] = read[i + 2];
 90             cout << Arr2[i][j] << " ";
 91             if (j % (n - 1) == 0 && j != 0)
 92                 //if (j == n-1)
 93                 cout << endl;
 94         }
 95     }
 96     infile.close();
 97 
 98     //把二维数组按行分解为几个一维数组
 99     for (i = 0; i<m; i++)
100     {
101         for (j = 0; j<n; j++)
102         {
103             Arr1[j] = Arr2[i][j];
104         }
105         Max1 = Max(n, Arr1, &Start_mark, &Final_mark);
106         up[i] = Start_mark;
107         down[i] = Final_mark;
108         h[i] = Max1;
109     }
110 
111     big = h[0];
112     for (i = 0; i + 1<m; i++)
113     {
114         if (up[i] <= down[i + 1] && down[i] >= up[i + 1])//联通,则相加
115             big += h[i + 1];
116         for (j = up[i]; j<up[i + 1]; j++)
117         {
118             if (Arr2[i + 1][j]>0)//是否独立正数,有则加
119                 big += Arr2[i + 1][j];     
120         }
121     }
122 
123     cout << "此二维数组的最大联通子数组的和为:" << endl;
124     cout << big << endl;
125     
126 }

运行结果如下:

      

    

     

三、实验心得体会

      对于本次实验,我们最开始尝试过遍历数组的方法,设置了结构体,将数组的数设置坐标,但是后来没有掌握好方法以失败告终。在课堂上受到同学的启发将二维数组编程一位数组,比如第一行和第二行加和后出现新的一位数组的方法,在网上阅读了写别人的思路,最后和小伙伴写出了这个程序。这个程序存在缺陷,个别的测试用例会出错,现在的程序只能解决最大连续数组相连的,还不能解决不相连的,对于最后今加上剩余的正数,只会加上与第一行重合的,第三行以及以下的行并不加上前一步加上的第二行的正数。这个缺陷会在以后慢慢完善,希望老师谅解。

最后附 孔同学(孔宇航)博客地址:http://www.cnblogs.com/kongyuhang/

转载于:https://www.cnblogs.com/2016helen/p/5352919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

曲线 线性回归_GRAPHPAD作图技巧(二)--拟合曲线

计算药物半抑制浓度IC50的拟合曲线图的做法&#xff1a;第一步&#xff1a;使用的版本是Graphpad Prism 5&#xff0c;打开软件后&#xff0c;选择XY作图方式&#xff1a;第二步&#xff1a;将实验所得的数据填写入图表中&#xff0c;注意x轴写入的是log[药物]&#xff0c;比如…

2 引入失败_苦等2年!总投资2800万!镇江首个民国风商场,来了!

超级重磅&#xff01;就在近日&#xff01;镇江备受关注的首个民国风商场九如商业广场终于完工&#xff0c;招商马上启动项目施工2年&#xff0c;总投资约2800万计划引入酒店、商业、超市等目前老宴春酒楼已确定入驻01总投资2800万&#xff01;九如商业广场终于完工&#xff0c…

EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...

在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时&#xff0c;我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案&#xff0c;主要就是我们的 EasyPusher直播推送项目 和 EasyPlayer播放器项目&#xff1b; 先大概对EasyPusher和EasyPlayer…

以下不属于时序逻辑电路的有_电工电子技术(不建议浪费时间学习的科目)

(声明&#xff1a;本资料来自网络&#xff0c;侵权请告知删除。文末有全套高清版资料下载链接&#xff0c;敬请下载学习)2019年7月在天津召开的土力学及岩土工程年会上&#xff0c;有一场青年教师的土力学讲课竞赛&#xff0c;由我作一些点评&#xff0c;其中关于土颗粒与土骨架…

12伏的蓄电池有几个单格组成_蓄电池的结构和识别

蓄电池是储备电能的一种直流装置。蓄电池充电时将电能转变为化学能&#xff0c;使用时内部化学能转变为电能向外输送给用电设备。蓄电池充放电过程是一种完全可逆的化学反应&#xff0c;因为蓄电池的充电和放电过程&#xff0c;可以重复循环多次&#xff0c;所以又称为二次电池…

第四周JAVA作业

本次作业实现实现了大文件快速拷贝 package copy; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { /** * param args */ public static void main(String[] args) { long startTime System.currentT…

2-jQuery - AJAX load() 方法【进阶篇】

第一篇的AJAX load() 方法过于简单&#xff0c;补充一下&#xff0c;完整的。 格式 $(selector).load(URL,data,callback); 源码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><script type"text/javascript" src"…

前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸

前端 JS 获取 Image 图像 宽高 尺寸简介项目中用到获取图片的原始尺寸&#xff0c;然后适配宽高&#xff1b;网上的大部分前端解决方案&#xff0c;都是new Image()后,在onload事件中获取image的尺寸。在图片数量较多的时候&#xff0c;这样的获取效率实在是低下。所有就有了这…

mysql linux 安装_mysql-5.7.28 在Linux下的安装教程图解

2.上传tar包到服务器到 /usr/local/src3.卸载系统自动的Mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_644.检查是否有mysql存在rpm -qa|grep -i mysql5.查询是否还有mysql的目录find / -name mysql6.解压&#xff1a;tar -zxvf7.修改名称&…

有关软件工程的问题的分析和讨论及课后的作业3

个人电脑界面的演变。 1973年四月第一次操作是在施乐PARC Alto计算机完成。 该系统是第一个将现代图形用户界面中的所有元素结合起来的系统。 1981年6月施乐介绍了星&#xff0c;商业阿尔托的继任者。 显著特点&#xff1a;双点击图标&#xff0c;重叠窗口&#xff0c;对话框和…

apache httpd mysql_Centos7安装配置Apache(httpd)+php+mysql+phpMyAdmin

一、安装mysql执行命令&#xff1a;rpm -ivh mysql-community-release-el7-5.noarch.rpm执行 yum -y install mysql mysql-server mysql-devel&#xff0c;安装成功。再次使用该命令&#xff0c;然后得到以下信息打开mysql服务 &#xff1a;service mysqld start进入mysql客户端…

如何:创建公钥/私钥对

要使用强名称为程序集签名&#xff0c;必须具有公钥/私钥对。 这一对加密公钥和加密私钥用于在编译过程中创建强名称程序集。 您可以使用强名称工具 (Sn.exe) 来创建密钥对。 密钥对文件通常具有 .snk 扩展名。 注意 在 Visual Studio 中&#xff0c;C# 和 Visual Basic 项…

用户设置及用户默认设置

1、创建 其中&#xff0c;Root.plist中为设置 2、读取应用中的设置 3、在应用中修改默认设置 4、注册默认值 5、保证设置有效&#xff08;我们注册所有控制器&#xff0c;以便接收从暂停执行状态唤醒的应用发送出来的通知&#xff09; 每个控制器都订阅我们关注的通知。 6、撤销…

activemq jdbc mysql_activeMQ JDBC Master Slave

ActiveMQ集群应用2\ ActiveMQ JDBC 主从集群3\ 解决单点故障&#xff1a;JDBC Master Slave本人应用的为集群方案中的一种&#xff0c; JDBC Master Slave &#xff0c;说明及好处就看如上外链文章了&#xff0c;上正题&#xff0c;方案如何实施及程序如何调用&#xff11;&…

orcale 基本查询(1)

orcale 基本查询      查询当前用户下的所有表&#xff1a;     select * from tab;      查询表结构&#xff1a;   desc 表名设置行宽&#xff1a;    set linesize 120;设置列宽&#xff1a;    数值类型&#xff1a;      col 列名 for…

优秀的Android资源

今天&#xff0c;收藏了一下“优秀的Android资源”&#xff0c;以后有时间也学习学习。 一、开发工具 开发android第一步就是安装开发工具SDK&#xff0c;国内有一些机构和公司对些作了境像&#xff0c;这个网站作了详细统计列表&#xff1a;http://www.androiddevtools.cn/&am…

监控mysql业务数据分析_MySQL数据库监控指标之执行性能总结

查询性能MySQL 用户监控查询延迟的方式有很多&#xff0c;既可以通过 MySQL 内置的指标&#xff0c;也可以通过查询性能模式。从 MySQL 5.6.6 版本开始默认启用&#xff0c;MySQL 的 performance_schema 数据库中的表格存储着服务器事件与查询执行的低水平统计数据。1、perform…

redis集群关闭 启动报错_使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能。...

实操题目:使用虚拟机搭建 Redis 集群&#xff0c;实现数据库的负载均衡功能。并使用图文描述整个过程。先创建集群:①创建集群需要使用ruby脚本,所以要先安装ruby环境 安装ruby环境:yum install ruby 安装ruby的包管理器:yum install rubygems②进入到redis的安装目录下的 src …

[转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法

HTML5的语义化标签以及属性&#xff0c;可以让开发者非常方便地实现清晰的web页面布局&#xff0c;加上CSS3的效果渲染&#xff0c;快速建立丰富灵活的web页面显得非常简单。 HTML5的新标签元素有&#xff1a; <header> 定义页面或区段的头部&#xff1b; <footer&…

mysql change index_MySQL · 引擎特性 · Innodb change buffer介绍

前言在前面几期月报我们介绍了undo log、redo log以及InnoDB如何崩溃恢复来实现数据ACID的相关知识。本期我们介绍另外一种重要的数据变更日志&#xff0c;也就是InnoDB change buffer。 Change buffer的主要目的是将对二级索引的数据操作缓存下来&#xff0c;以此减少二级索引…