结对开发——最大联通子数组的和

一、题目及要求

题目:返回一个二维整数数组中最大联通子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素
每一个数字都是有符号32位整数,当然,行数和列数都是正整数。
二、设计思想
因为每一个数字都是有符号32位整数,所以选择了long型。从文件中读取,采用c++输入输出流。矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。
三、源代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include<iostream>
#include<fstream>
using namespace std;
 
long Max( long n, long a[], long *smark, long *mmark)
{
     long b[100]={0};
     long sum1=0,max1=0,i;
     for (i=0;i<n;i++)
     {
         if (sum1<0)
         {
             sum1=a[i];
         }
         else
         {
             sum1=sum1+a[i];
         }
         b[i]=sum1;
     }
     max1=b[0];
     for (i=0;i<n;i++)
     {
         if (max1<b[i])
          {
              max1= b[i];
              *mmark = i;
          }
     }
      for (i = *mmark;i >= 0;i--)
     {
         if (b[i] == a[i])
         {
              *smark = i;
              break ;
         }
     }
      return max1;
}
 
int main()
{
     long m,n,i,j,t2,c[2];
     long sum,smark,mmark;
     long up[100],down[100],t[100];
     long a[100][100],b[100];
     ifstream infile;
     infile.open( "input.txt" , ios::in);
       if (infile.is_open() == false )
       {
          cerr << "open error!" << endl;
          exit (1);
       }
     
     cout<< "二维数组的行数和列数:" ;
      for (i=0;i<2;i++)
      {
      infile >> c[i];
      
      }          //在显示器上顺序显示个数
      m=c[0];
      n=c[1];
      cout<<m<< " " <<n<<endl;
     cout<< "数组为" <<endl;
     for (i=0;i<m;i++)
     {
         for (j=0;j<n;j++)
         {
             infile>>a[i][j];
             cout<<a[i][j]<< "   " ;
         }
         if (j%n==0)
         {
             cout<<endl;
         }
     }
     //把二维数组按行分解为几个一维数组
     for (i=0;i<m;i++)
     {
         for (j=0;j<n;j++)
         {
             b[j]=a[i][j];
         }
         sum=Max(n,b,&smark,&mmark);
         up[i]=smark;                                   
         down[i]=mmark;
         t[i]=sum;
 
     }
     t2=t[0];
     for (i=0;i+1<m;i++)
     {
         if (up[i]<=down[i+1] && down[i]>=up[i+1])
         {
             t2+=t[i+1];
         }
          for (j=up[i];j<up[i+1];j++)
         {
             if (a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
         }
 
     }
      cout<< "最大联通子数组和为" ;
      cout<<t2<<endl;
      return 0;
 
}

四、结果截图

 

五、项目计划日志

 

日期&&任务

听课编写程序阅读相关书籍网上查找资料  日总计
周一100 3030160
周二 1203030180
周三 30301070
周四10020 30 150
周五 120  3030180
周六 145301085
周日 20030   
周总计200635210110

1155

 

时间记录日志

3/28

日期开始时间结束时间中断时间净时间活动备注
3/2814:0015:5010100听课软件工程上课
 21:0421:  34030阅读书籍《构建之法》
 22:1022: 4030网上查找资料 查阅安卓相关资料
 3/29 18:00 18:30 0 30 阅读书籍《构建之法》 
 19:0021:3020120编写程序结对开发- 安卓APP
 22:  1522:  4530网上查找资料 查阅安卓相关资料
3/3019:  2520: 00530编写程序结对开发- 安卓APP
 22:0022: 30030阅读书籍《构建之法》
 22:4022: 50010查找资料 查阅安卓相关资料
3/3114:0015:  5010100上课软件工程上课
 18:2618: 5020编写程序结对开发- 联通版
  22:00 22:30 0 30 阅读书籍 《构建之法》
4/114:  0016:  2020120 编写程序结对开发- 安卓APP
 11:2312: 00730网上查找资料 查阅安卓相关资料
  21:00 21:30 0 30 阅读书籍 《构建之法》
4/27: 00  7: 30030阅读书籍阅读《构建之法》
 10: 0013: 0035145编写程序结对开发- 安卓APP
 9:   45  9: 55 010网上查找资料 查阅安卓相关资料
4/38:2012:  0020200编写程序结对开发-联通版
 15: 2316: 00730阅读书籍阅读《构建之法》

 

缺陷记录日志

 

日期编号类型引入阶段排除阶段修复时间备注
3/31120编码编译4最开始没有定义long型
3/31220编码编译1文件打开有问题
4/120 编码 编译 7当数组长度为0时,无法正常跳出

 

同组的小伙伴:http://www.cnblogs.com/a1397240667/p/5294473.html

转载于:https://www.cnblogs.com/qizhonh/p/5360641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值