数组03

一、题目

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

二、要求

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

  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  求所有子数组的和的最大值。

三、设计思想

  本次数组03实验是在上次实验的基础上,利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。这样的缺陷是时间花费比较多,而且没有用文件来实现,只是实现在程序中输入输出。

四、源代码

  1 //数组03
  2 //胡浩特、朱子嘉 2016/3/28
  3 
  4 #include <iostream>
  5 using namespace std;
  6 
  7 int maxSubArray(int **a, int n, int m)
  8 {
  9     int **p = new int*[n];
 10     int i, j;
 11     if (m == 0 || n == 0)
 12         return 0;
 13     //计算p[i][j]    
 14     for (i = 0; i<n; i++)
 15     {
 16         p[i] = new int[m];
 17         for (j = 0; j<m; j++)
 18         {
 19             if (i == 0)
 20             {
 21                 if (j == 0)
 22                     p[i][j] = a[i][j];
 23                 else
 24                     p[i][j] = p[i][j - 1] + a[i][j];
 25             }
 26             else
 27             {
 28                 if (j == 0)
 29                     p[i][j] = p[i - 1][j] + a[i][j];
 30                 else
 31                     p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j];
 32             }
 33         }
 34     }
 35     //计算二维数组最大子数组的和
 36     int temp;
 37     int max = a[0][0];//初始化
 38     int sum = a[0][0];
 39     if (m == 1)
 40     {
 41         for (i = 0; i<n; i++)
 42         {
 43             for (j = i; j<n; j++)
 44             {
 45                 if (i == 0)
 46                 {
 47                     temp = p[j][m - 1];
 48                 }
 49                 else
 50                 {
 51                     temp = p[j][m - 1] - p[i - 1][m - 1];
 52                 }
 53                 if (sum<temp)
 54                     sum = temp;
 55             }
 56         }
 57     }
 58     else
 59     {
 60         for (i = 0; i<n; i++)
 61         {
 62             for (j = i; j<n; j++)
 63             {
 64                 if (i == 0)
 65                 {
 66                     temp = p[j][m - 1] - p[j][m - 2];
 67                 }
 68                 else
 69                 {
 70                     temp = p[j][m - 1] - p[j][m - 2] - p[i - 1][m - 1] + p[i - 1][m - 2];
 71                 }
 72                 for (int k = m - 2; k >= 0; k--)
 73                 {
 74                     if (temp<0)
 75                         temp = 0;
 76                     if (i == 0)
 77                     {
 78                         if (k == 0)
 79                             temp += p[j][k];
 80                         else
 81                             temp += p[j][k] - p[j][k - 1];
 82                     }
 83                     else
 84                     {
 85                         if (k == 0)
 86                             temp += p[j][k] - p[i - 1][k];
 87                         else
 88                             temp += p[j][k] - p[j][k - 1] - p[i - 1][k] + p[i - 1][k - 1];
 89                     }
 90                     if (sum<temp)
 91                         sum = temp;
 92                 }
 93             }
 94         }
 95     }
 96     return sum;
 97 }
 98 
 99 int main()
100 {
101     int n;//行数
102     int m;//列数
103     
104     cout << "请输入二维数组的行数:" << endl;
105     cin >> n;
106     cout << "请输入二维数组的列数:" << endl;
107     cin >> m;
108 
109     int i, j;
110     int **a = new int*[n];
111     cout << "请输入该二维数组元素:" << endl;
112     for (i = 0; i<n; i++)
113     {
114         a[i] = new int[m];
115 
116         for (j = 0; j<m; j++)
117         {
118             cin >> a[i][j];
119         }
120     }
121     int sum;//最大字数组的和 
122     sum = maxSubArray(a, n, m);
123     cout << "二维数组的最大子数组之和:" << sum << endl;
124     return 0;
125 }

五、实验结果

 

六、实验总结

  本次实验的算法不够简洁,希望可以找到更加高效的算法,而且没有实现从txt文件中读入二维数组的数值,希望以后可以改进,这次实验虽然不难,但也学到了不少知识,以及如何把二维数组降维成一维数组。

原文地址:https://www.cnblogs.com/JYQ-hu/p/5338926.html