zoukankan      html  css  js  c++  java
  • 求二维整型数组的所有子数组的和的最大子数组

     //注:本次小队成员为:王友军,白宇乾,黄瑞玻;原因与上一次相同,请见谅。

    本次作业是关于二维整型数组的最大子数组的求解,相比第一次的一维数组来说,确实难了些。经过我们的苦思冥想,想了很多设计思路,但是都是存在着很多问题;在没有别的好的方法选择之后,我们只能选择了最基本的:枚举法进行求解。设计思路:

    1.确定二维数组的所有子数组的数量,并用一个一维整型数组sum[]存储;

    2.从第一个元素开始,以第一个元素为子数组的起始元素,将整个数组遍历,每得到一个二维子数组,就存储到sum[]中;然后以第二个元素为开始;依此类推,直到最后一个元素结束。

    3.然后求出sum[]数组中的最大元素,则该元素就是最大的子数组和。

    程序代码:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int m,n;
     7     cout << "请输入二维数组的行和列:";
     8     cin >> n>> m;
     9     //定义一个可变长二维数组;
    10     int** a;
    11     a = new int*[n];
    12     for (int i = 0; i <= n; i++)
    13     {
    14         a[i] = new int[m];
    15     }
    16     //定义一个存储二维数组所有子数组的可变长一维数组;
    17     int *sum=new int [m*(m+1)*n*(n+1)/4];
    18     for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++)
    19     {
    20         sum[i] = 0;
    21     }
    22     int t = 0;
    23     cout << "输入数组的值:" << endl;
    24     for (int i = 0; i < n; i++)
    25     {
    26         for (int j = 0; j < m; j++)
    27         {
    28             cin >> a[i][j];
    29         }
    30     }
    31     //用枚举法将所有子数组的和求出,放到sum数组里;
    32     for (int i = 0; i < n; i++)
    33     {
    34         for (int j = 0; j < m; j++)
    35         {
    36             for (int p = i; p < n; p++)
    37             {
    38                 for (int q = j; q < m; q++)
    39                 {
    40                     for (int y = i; y <= p; y++)
    41                     {
    42                         for (int x = j; x <= q; x++)
    43                         {
    44                             //求子数组和;
    45                             sum[t] = sum[t] + a[y][x];
    46                         }
    47                     }
    48                     t++;
    49                 }
    50             }
    51         }
    52     }
    53     //求最大子数组;
    54     for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++)
    55     {
    56         if (sum[0] < sum[i])
    57         {
    58             sum[0] = sum[i];
    59         }
    60     }
    61     cout<< "最大子数组的和为:"<<sum[0] << endl;
    62     system("pause");
    63     return 0;
    64 }

    测试截图:

    小组成员:

  • 相关阅读:
    虚拟机的三种联网模式(桥接模式、NAT 模式、仅主机模式)
    Vue 分页器 Pagination 实现点击分页器,平滑到对应的dom组件,而不是直接切换对应的组件
    img图片的处理技巧
    Vue中在DOM组件上动态绑定数据
    vue3.0中使用postcss-pxtorem
    vue中实现点击div有样式去除样式 无样式添加样式
    网易云音乐API,的调用方法 ,vue项目中(在本地使用)
    我的mixin.scss文件
    kendo-ui 几个有用的数据操作
    开发中常见的common.js--1
  • 原文地址:https://www.cnblogs.com/Kirito-math/p/9826018.html
Copyright © 2011-2022 走看看