数组04-最大联通子数组

不打扰是莪最后的温柔 提交于 2020-01-11 20:56:53

一、题目

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

二、要求

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

  求所有子数组的和的最大值。要求时间复杂度为O(n)。

  程序所要使用的数组放在一个input.txt的文件中。

三、设计思想

  本次实验设计思路是根据课上同学讲的方法写的,主要是:正数加进来,遇到负数就跳过。

  数据好像流水一般,就往正数方向流动并相加,直到取得的最大联通子数组和最大。

四、源代码

  

  1 //数组04
  2 //胡浩特、朱子嘉 2016/4/5
  3 
  4 #include<iostream>
  5 #include<ctime>
  6 #include<fstream>
  7 using namespace std;
  8 
  9 void main()
 10 {
 11     int m, n, i, j, sum;
 12     int smark, mmark, t2;
 13     int up[100], down[100], t[100];
 14     int a[100][100], b[100];
 15 
 16     cout << "请输入二维数组的行数:" << endl;
 17     cin >> m;
 18     cout << "请输入二维数组的列数:" << endl;
 19     cin >> n;
 20     cout << "请输入二维数组的元素:" << endl;
 21     for (i = 0; i<m; i++)
 22     {
 23         for (j = 0; j<n; j++)
 24         {
 25             cin >> a[i][j];//输入二维数组的元素
 26         }
 27     }
 28     
 29     for (i = 0; i<m; i++)
 30     {
 31         for (j = 0; j<n; j++)
 32         {
 33             b[j] = a[i][j];
 34         }
 35         int c[100] = { 0 };
 36         int sum1 = 0, max1 = 0, k;
 37         for (k = 0; k<n; k++)           //在列上求每一个最大子数组
 38         {
 39             if (sum1<0)
 40             {
 41                 sum1 = b[k];
 42             }
 43             else
 44             {
 45                 sum1 = sum1 + b[k];
 46             }
 47             c[k] = sum1;
 48         }
 49         max1 = c[0];
 50         for (k = 0; k<n; k++)
 51         {
 52             if (max1<c[k])
 53             {
 54                 max1 = c[k];
 55                 mmark = k;
 56             }
 57         }
 58         for (k = mmark; k >= 0; k--)
 59         {
 60             if (c[k] == b[k])
 61             {
 62                 smark = k;
 63                 break;
 64             }
 65         }
 66         sum = max1;
 67 
 68         up[i] = smark;
 69         down[i] = mmark;
 70         t[i] = sum;
 71 
 72     }
 73     t2 = t[0];
 74     for (i = 0; i + 1<m; i++)
 75     {
 76         if (up[i] <= down[i + 1] && down[i] >= up[i + 1])
 77         {
 78             t2 += t[i + 1];
 79         }
 80         for (j = up[i]; j<up[i + 1]; j++)
 81         {
 82             if (a[i + 1][j]>0) t2 += a[i + 1][j];                   //判别独立正数
 83         }
 84 
 85     }
 86     //文件输出
 87     ofstream fout("D:\\input.txt", ios::binary);
 88     for (i = 0; i<m; i++)
 89     {
 90         for (j = 0; j<n; j++)
 91         {
 92             fout << a[i][j] << " ";
 93 
 94         }
 95         fout << endl;
 96     }
 97 
 98     fout << "最大联通子数组的和为:" << t2 << endl;
 99 
100 }

五、实验截图

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!