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


    设计思路:

      通过之前一维环,进行拓展,成数组。

    代码:

     1 //XiaoSong Du 2015/4/20
     2 #include <iostream>
     3 #include <time.h>
     4 using namespace std;
     5 #define M 3
     6 #define N 6
     7 
     8 void main()
     9 {
    10     int a[M][2*N]={0},b[2*N],d = 0,d1 = 0;
    11     int maxd[2*N]={0} ,end1[2*N] = {0},end2 = 0;
    12     int i_max = 0,j_max = 0 ,jj = -1,j1 = 0,j2 = -1;
    13 
    14     srand((unsigned int)time(0));    
    15 
    16     for (int i = 0;i < M;i++)
    17     {
    18         for (int j = 0;j < N;j++)
    19         {
    20             a[i][j] = rand()%50 - 25;
    21             a[i][j+N] = a[i][j];
    22             cout << a[i][j] << " ";
    23         }    
    24         cout << endl;
    25     }
    26 
    27     maxd[0] = a[0][0];
    28     for (int i = 0;i < M;i++)//i为0,表示1行,i为1表示两行数···
    29     {
    30         for (int i_hang = 0;i_hang < M-i;i_hang++)//当1行是循环3次
    31         {
    32             for (int j = 0;j < 2*N;j++)//赋初值
    33             {
    34                 b[j] = 0;
    35             }
    36             for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)//每次循环i次赋值
    37             {
    38                 for (int j = 0;j < 2*N;j++)
    39                 {
    40                     b[j] += a[i_hang1][j];
    41                 }
    42             }
    43             d = 0;j2 = -1;j1=0;jj=-1;
    44             for (int ii = 0;ii < 2*N;ii++)
    45             {    
    46                 d += b[ii]; 
    47                 if (d > maxd[j1-1])
    48                 {
    49                     maxd[j1] = d;
    50                     end1[j1] = ii;
    51                     i_max = i;       //最大的时候是i行;
    52                     j_max = i_hang;   //
    53                     j1++;
    54                     j2 = jj;
    55                 }
    56                 if(d < 0)
    57                 {
    58                     d = 0;
    59                     jj = ii;
    60                 }
    61 
    62                 if (end1[j1-1] - j2 > N)   //如果end1[j1-1] - j2大于N个数,那么就获取end1[j1-2]
    63                 {    
    64                     j1--;
    65                     break;
    66                 }
    67             }
    68             end2 = j2+1;            
    69         }
    70     }    
    71     cout << "子数组为:" << endl;
    72     
    73     for (int k = 0;k <= i_max;k++)
    74     {
    75         for (int i = end2;i <= end1[j1-1];i++)
    76         {
    77             cout << a[j_max+k][i] << " ";
    78         }
    79         cout << endl;
    80     }
    81     cout << endl;
    82     cout << "和为: " << maxd[j1-1] << endl;    
    83 }

    结果截图:

    总结:
      

      

      在整合的过程中发生了一列错误,以至于到时间都没完善代码,只能先把博客发表,之后慢慢完善。程序多次运行后会出错误,可是大概是思路僵化的原因,就是解决不了。暂时先凉一下吧。

  • 相关阅读:
    apiCode/1/1.1/1.1.1
    ZOJ 3195 Design the city LCA转RMQ
    IOS学习之路十二(UITableView下拉刷新页面)
    ASP.NET 缓存技术分析
    电信支撑系统
    android提权
    awk
    linux高效shell命令总结
    C关键字typedef及argc,argv,env参数含义
    2013年6月编程语言排行榜,C语言位据第一位
  • 原文地址:https://www.cnblogs.com/zrdm/p/4448912.html
Copyright © 2020-2023  润新知