zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中的最大子数组之和(环)

    要求:
    输入一个二维整形数组,数组里有正数也有负数。
    二维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。
    思路:
    根据前几次所做的关于一维及二维数组的思路,将其整合。
    把二维数组转换成一维数组,再用求一维数组最大子数组和(环)的方式求解
     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 }

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

  • 相关阅读:
    做一点,记一点 ~ JQuery EasyUI使用小结(注意点)
    做一点,记一点 ~ Java调用Oracle存储过程
    Linux中定时执行DB2的存储过程
    Apache POI -- Java 导出Excel文档(笔记)
    一篇很不错的学习Flex的入门级教程
    Java的String和StringBuffer和StringBuilder详解
    Java操作properties文件
    认识WebService
    J2EE安全策略:为tomcat页面设置访问权限(j_security_check)
    MyEclipse 2014常用设置
  • 原文地址:https://www.cnblogs.com/SanShaoS/p/4443271.html
Copyright © 2011-2022 走看看