zoukankan      html  css  js  c++  java
  • 数组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文件中读入二维数组的数值,希望以后可以改进,这次实验虽然不难,但也学到了不少知识,以及如何把二维数组降维成一维数组。

  • 相关阅读:
    VisualC#的菜单编程
    利用Mutex实现应用程序的单实例运行
    C#下实现动态系统托盘图标
    C#中TreeView组件使用方法初步
    VisualC#中实现窗体间的数据传递之一
    AJAX在VS2005中的简单应用
    LiteORM学习一:EntityObject 设计
    读书笔记:人月神话的博客积极的心态读后感
    LiteORM学习三:查询设计
    LiteORM学习二:数据库设计
  • 原文地址:https://www.cnblogs.com/JYQ-hu/p/5338926.html
Copyright © 2011-2022 走看看