码迷,mamicode.com
首页 > 编程语言 > 详细

返回一个二维整数数组中的最大子数组之和(环)

时间:2015-04-21 08:19:16      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
思路:
根据前几次所做的关于一维及二维数组的思路,将其整合。
把二维数组转换成一维数组,再用求一维数组最大子数组和(环)的方式求解
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<ctime>
 4 using namespace std;
 5 #define M 4
 6 #define N 4
 7 #include <memory.h>  
 8 
 9 int maxSubArray(int *arr, int size)       //最大子序列和  
10 {
11     int i, sum, max1, max2, dp, min;
12     dp = max1 = arr[0];
13     for (i = 1; i < size; ++i)//非环形数组;++i,先i自加1,再使用i的值
14     {
15         if (dp < 0)
16             dp = arr[i];
17         else
18             dp += arr[i];
19         if (dp > max1)
20             max1 = dp;
21     }
22     sum = min = dp = arr[0];
23     for (i = 1; i < size; ++i)//求数组最小子数组和,再用数组全部元素和减去,则结果跨过arr[n-1]到arr[0]
24     {
25         if (dp>0)
26             dp = arr[i];
27         else
28             dp += arr[i];
29         if (dp < min)
30             min = dp;
31         sum += arr[i];
32     }
33     max2 = sum - min;//数组全部元素和减去最小子数组
34     return max1>max2 ? max1 : max2;//三目运算符;如果max1>max2,将max1的值返回,否则返回max2
35 }
36 int maxSubMatrix(int n, int m, int array[M][N])
37 {
38     int i, j, h, max, sum = -100000;
39     int b[100];
40     for (i = 0; i<n; i++)
41     {
42         memset(b, 0, sizeof(b));       //初始化b[]  
43         for (j = i; j<n; j++)          //把第i行到第j行相加,对每一次相加求出最大值  
44         {
45             for (h = 0; h<m; h++)
46             {
47                 b[h] += array[j][h];   //二维数组压缩成一维数组,然后求最大子序列和  
48             }
49             max = maxSubArray(b, h);
50 
51             if (max>sum)
52                 sum = max;
53         }
54     }
55     return sum;
56 }
57 int main()
58 {
59     int arr[M][N];
60     cout << "随机二维数组为:" << endl;
61     srand(time(0));
62     for (int i = 0; i < M; i++)
63     {
64         for (int j = 0; j < N; j++)
65         {
66             arr[i][j] = rand() % 50 - 25;
67             cout << arr[i][j] << " ";
68         }
69         cout << endl;
70     }
71     cout <<"最大子数组的和:"<< maxSubMatrix(M, N, arr) << endl;
72     return 0;
73 }

技术分享

总结:每次编程结束后都应当将自己的程序保存下来,方便复用,同时,也可以看出,将程序分模块实现的好处。

返回一个二维整数数组中的最大子数组之和(环)

标签:

原文地址:http://www.cnblogs.com/SanShaoS/p/4443271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!