• 数组04-最大联通子数组


    一、题目

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

    二、要求

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

      求所有子数组的和的最大值。要求时间复杂度为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 }

    五、实验截图

     

  • 相关阅读:
    为什么要用webUI?
    探索WebKit内核(一)------ 菜鸟起步
    主进程退出的时候,杀死所有子进程
    那两年炼就的Android内功修养
    飞鸽---局域网聊天软件攻防战
    如何利用Fluxion诱惑目标用户获取WPA密码
    性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench
    解决maven编译错误:程序包com.sun.xml.internal.ws.spi不存在
    Apache-Flink深度解析-DataStream-Connectors之Kafka
    linux下find(文件查找)命令的用法总结
  • 原文地址:https://www.cnblogs.com/JYQ-hu/p/5359981.html
Copyright © 2020-2023  润新知