• 结对开发之返回一个二维整数数组中最大联通子数组的和


    一、题目要求

    输入一个二维整形数组,数组里有正数也有负数。
    二维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。
    要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和

    二、解题思路

          先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。

    三、程序代码

      2 #include<iostream.h>
      3 int main(int argc, char* argv[])
      4 {
      5     int i,j;
      6     int a[3][5]={{1,-2,3},{1,-3,2},{4,-4,5}};
      7     int b[3][5];
      8     for(i=0;i<3;i++)
      9     {
     10      for(j=0;j<2;j++)
     11         a[i][j+3]=a[i][j];
     12     }
     13     int max=a[0][0];
     14     cout<<"初始二维数组为:"<<endl;
     15     for(i=0;i<3;i++)
     16     {
     17         for(j=0;j<3;j++)
     18         {
     19             cout<<a[i][j]<<' ';
     20         }
     21         cout<<endl;
     22     }
     23     cout<<"重构后环形数组为:"<<endl;
     24     for(i=0;i<3;i++)
     25     {
     26         for(j=0;j<5;j++)
     27         {
     28             cout<<a[i][j]<<' ';
     29         }
     30         cout<<endl;
     31     }
     32 
     33 
     34     for(i=0;i<1;i++)
     35     {
     36         b[0][0]=a[0][0];
     37         for(j=0;j<5;j++)
     38         {
     39             if(a[0][j-1]<0)
     40             {
     41                 b[0][j]=a[0][j];
     42             }
     43             else
     44             {
     45                 b[0][j]=b[0][j-1]+a[0][j];
     46             }        
     47         }
     48     }
     49     for(i=1;i<3;i++)
     50     {
     51         for(j=0;j<1;j++)
     52         {
     53             if(a[i-1][0]<0)
     54             {
     55                 b[i][0]=a[i][0];
     56             }
     57             else
     58             {
     59                 b[i][0]=b[i-1][0]+a[i][0];
     60             }
     61         }
     62     }
     63     for(i=1;i<3;i++)
     64     {
     65         for(j=1;j<5;j++)
     66         {
     67             if(b[i-1][j-1]<0)
     68             {
     69                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
     70                 {
     71                     if(b[i][j-1]>=b[i-1][j])
     72                     {
     73                         b[i][j]=b[i][j-1]+a[i][j];
     74                     }
     75                     else
     76                     {
     77                         b[i][j]=b[i-1][j]+a[i][j];
     78                     }
     79                 }
     80                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
     81                 {
     82                     b[i][j]=b[i-1][j]+a[i][j];
     83                 }
     84                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
     85                 {
     86                     b[i][j]=b[i][j-1]+a[i][j];
     87                 }
     88                 else
     89                 {
     90                     b[i][j]=a[i][j];
     91                 }
     92             }
     93             else
     94             {
     95                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
     96                 {
     97                     b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
     98                 }
     99                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
    100                 {
    101                     b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
    102                 }
    103                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
    104                 {
    105                     b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
    106                 }
    107                 else
    108                 {
    109                     b[i][j]=a[i][j];
    110                 }
    111             }
    112         }
    113     }
    114     cout<<"子矩阵的和数组为:"<<endl;
    115     for(i=0;i<3;i++)
    116     {
    117         for(j=0;j<5;j++)
    118         {
    119             cout<<b[i][j]<<" ";
    120         }
    121         cout<<endl;
    122     }
    123     cout<<endl;
    124     for(i=0;i<3;i++)
    125     {
    126         for(j=0;j<5;j++)
    127         {
    128             if(b[i][j]>max)
    129                 max=b[i][j];
    130         }
    131     }
    132     cout<<"最大子矩阵和为:"<<max<<endl;
    133     return 0;      
    134 
    135 }

    四、运行截图

    五、实验总结

        求二维数组最大子矩阵的和,求环形一维数组的最大子数组的和,环形一维时,我们采用了跨越首尾和不跨越首尾两种情况,发现这种方法不适用于二维,所以采用了重构数组的方法,转化成非环形,然后求二维最大子数组的和。开始在循环条件那儿遇到了问题,后来我们两个一起解决了,这次合作让我体会到了搭档的重要性,总之,这次结对开发很成功,以后继续努力。

  • 相关阅读:
    P1215 [USACO1.4]母亲的牛奶 Mother's Milk
    P2966 [USACO09DEC]牛收费路径Cow Toll Paths
    P2419 [USACO08JAN]牛大赛Cow Contest
    1085 数字游戏
    P1983 车站分级
    P1346 电车(dijkstra)
    P1196 银河英雄传说(加权并查集)
    P1195 口袋的天空
    3027 线段覆盖 2
    codevs 1214 线段覆盖/1643 线段覆盖 3
  • 原文地址:https://www.cnblogs.com/yuji5656/p/4575830.html
Copyright © 2020-2023  润新知