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


    一、程序题目

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

    二、程序要求

      1、输入一个二维整形数组,数组中有正数也有负数。

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

      3、程序要使用的数组放在一个叫input.txt的文件中,文件格式是:

        数组的行数,

        数组的列数,

        每一行的元素,(用逗号分开)

        

      4、每一个数字都是有符号32位整数,当然,行数和列数都是正整数。

    三、程序设计思想

      将二维矩阵转换成图的形式,即相邻两个数之间是联通的,记长度为1;根据图的遍历,将整个图从每个点都开始遍历一遍,便利时,当和小于0时断开两点间的路,当和大于最大和时最大和更新,这样,取以每个点为起点遍历的和的最大值即时最大联通子数组的和。遍历时,选取已遍历的联通子数组周围最大值遍历。

    四、源程序代码

      1 //李俏、张莹荧,2016.4.2
      2 //求整数数组的最大子数组的和
      3 
      4 #include<iostream>
      5 #include<fstream>
      6 #include<ctime>
      7 using namespace std;
      8 #define N 100
      9 
     10 typedef struct
     11 {
     12     int dian[N];
     13     int xian[N][N];
     14     int diannum;//数组中元素个数
     15 }Tu;//
     16 
     17 void set(Tu &shuzu, int x, int y)
     18 {
     19     int i, j;
     20     fstream infile("input.txt", ios::in); //打开指定文件     
     21     if (!infile)
     22     {
     23         cout << "open error!" << endl;
     24         exit(1);
     25     }
     26     infile >> x >> y;    //从文件中读取数组行数和列数
     27     shuzu.diannum = x*y;
     28     for (i = 1; i <= shuzu.diannum; i++)//从文件中读取数组元素
     29     {
     30         infile >> shuzu.dian[i];
     31     }
     32     infile.close();
     33 
     34     for (i = 1; i <= shuzu.diannum; i += y)
     35     {
     36         for (j = i; j <= i + y - 2; j++)
     37         {
     38             shuzu.xian[j][j + 1] = 1;
     39             shuzu.xian[j + 1][j] = 1;
     40         }
     41     }
     42     for (i = 1 + y; i<shuzu.diannum; i += y)
     43     {
     44         for (j = i; j <= i + x - 1; j++)
     45         {
     46             shuzu.xian[j][j - y] = 1;
     47             shuzu.xian[j - y][j] = 1;
     48         }
     49     }//将一维数组转换成二维图的形式
     50 }
     51 
     52 void output(Tu shuzu)//以图的形式输出数组
     53 {
     54     for (int i = 1; i <= shuzu.diannum; i++)
     55     {
     56         cout << shuzu.dian[i];
     57         if (shuzu.xian[i][i + 1] == 1)
     58             cout << "    ";
     59         else
     60             cout << endl;
     61     }
     62 }
     63 
     64 void bianli(Tu &shuzu, int v, int visit[], int &b, int &max, int x)//遍历图
     65 {
     66     visit[v] = 1;
     67 
     68     max += shuzu.dian[v];
     69     if (max >= b)
     70         b = max;
     71 
     72     int a = 0, bo = 0;
     73     for (int w = 1; w <= shuzu.diannum; w++)
     74     {
     75         for (int c = 1; c <= shuzu.diannum; c++)
     76         {
     77             if ((visit[w] == 0) && (shuzu.xian[c][w] == 1) && (visit[c] == 1))
     78             {
     79                 a = w;
     80                 bo = 1;
     81                 break;
     82             }
     83         }
     84         if (bo == 1)
     85         {
     86             break;
     87         }
     88     }
     89     for (int w = 1; w <= shuzu.diannum; w++)
     90     {
     91         for (int c = 1; c <= shuzu.diannum; c++)
     92         {
     93             if ((visit[w] == 0) && (shuzu.xian[c][w] == 1) && (visit[c] == 1))
     94             {
     95                 if (shuzu.dian[a]<shuzu.dian[w])
     96                 {
     97                     a = w;
     98                 }
     99             }
    100         }
    101     }
    102     if (b + shuzu.dian[a]<0)
    103     {
    104         shuzu.xian[v][a] = 0;
    105     }
    106     else
    107     {
    108         bianli(shuzu, a, visit, b, max, x);
    109     }
    110 }
    111 
    112 int NoVisit(int visit[], Tu shuzu)
    113 {
    114     int k = 0, i;
    115     for (i = 1; i <= shuzu.diannum; i++)
    116     {
    117         if (visit[i] == 0)
    118         {
    119             k = i;
    120             break;
    121         }
    122     }
    123     return k;
    124 }//判断图中没有visit的项
    125 
    126 int main()
    127 {
    128     Tu shuzu;
    129     int x, y;
    130     int i;
    131 
    132     fstream infile("input.txt", ios::in); //打开指定文件     
    133     if (!infile)
    134     {
    135         cout << "open error!" << endl;
    136         exit(1);
    137     }
    138     infile >> x >> y;    //从文件中读取数组行数和列数
    139     for (i = 1; i <= x*y; i++)
    140     {
    141         infile >> shuzu.dian[i];
    142     }
    143     infile.close();
    144     set(shuzu, x, y);
    145     cout << "数组为:" << endl;
    146     output(shuzu);
    147 
    148     int v = 1, b[N] = { 0 }, h = 0;
    149 
    150     for (i = 1; i <= shuzu.diannum; i++)
    151     {
    152         if (shuzu.dian[i]<0)
    153         {
    154             b[i] = shuzu.dian[i];
    155         }
    156         else
    157         {
    158             int visit[N] = { 0 };
    159             int max = 0;
    160             bianli(shuzu, i, visit, b[i], max, x);
    161         }
    162     }
    163 
    164     int max = b[1];
    165     for (int i = 2; i <= shuzu.diannum; i++)
    166     {
    167         if (b[i]>max)
    168             max = b[i];
    169     }
    170     cout << "最大联通子数组的和为:" << max << endl;
    171 
    172     return 0;
    173 }
    五、运行结果截图

        

      

    六、时间记录日志:

      学生:张莹荧                 日期:2016-04-06

      教师:王建民                 课程: PSP  

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    4.03

    14:30

    16:10

    16:00

    17:40

    0

    0

    90

    90

    编程

    阅读课本

     中间上网、休息
    4.04

    8:00

    14:00

    12:00

    15:50

    40

    10

    200

    100

    上课 课间休息
    4.05

    14:30

    19:00

    17:40

    19:30

    10

    0

    180

    30

    编程

    阅读课本

    中间休息
    4.06

    12:30

    19:00

    13:30

    19:30

    0

    0

    60

    30

    编程

    阅读课本

    七、缺陷记录日志

      学生:    李俏,张莹荧    

      日期:   2016年4月6日 

      教员:      王建民       

      程序号:     4     

    日期  编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
     4.4  1 数组 设计 编译 15min  
    描述:数组长度不合适,导致元素缺失
     4.6  2 文件 设计 编译 30min  
    描述:没有考虑好,把问题想复杂了,不能有效地从文件中读出数据
    八、结对开发队友
      李俏 信1301-2班 20132912
      博客地址:http://www.cnblogs.com/Aliqiao/
      工作照:
      
      
      
  • 相关阅读:
    bzoj3832
    bzoj2117
    bzoj1095
    BZOJ 4247: 挂饰 题解
    1296: [SCOI2009]粉刷匠
    3163: [Heoi2013]Eden的新背包问题
    2287: 【POJ Challenge】消失之物
    1334: [Baltic2008]Elect
    2748: [HAOI2012]音量调节
    1606: [Usaco2008 Dec]Hay For Sale 购买干草
  • 原文地址:https://www.cnblogs.com/zhyying/p/5358262.html
Copyright © 2020-2023  润新知