zoukankan      html  css  js  c++  java
  • 求一维数组的最大子数组1(结对开发)

    题目:返回一个整数数组中最大子数组的和。
    要求:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)

    发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。

    结对开发的伙伴:

    博客名:Mr.缪

    姓名:缪金敏

    链接:http://www.cnblogs.com/miaojinmin799/

    分析:

    如果按照最笨的方法就是一个一个的比较先比较一个数的然后二个,直到个数为n为止,但是这样时间复杂度一算估计得要O(n*n),所以不可行,后来通过上网查阅,找到了动态规划方法来实现求最大和,把比较大小分解为一小段一小段,每次比较输入数和输入前几个数之和的大小,选择最大的。要想输出子数组,就必须判断开始下标和结束下标。开始下标的条件:数组第二列的数前一个比现在的小且小于0且第一列的数小于等于第二列。结束下标的条件:当前的算出的最大子数组+输入的值比下一步的最大值大于或等于,或第二列的数大于等于第一列。

    所遇到困难:

    开始下标和结束下标考虑过于单一,有些特殊情况没有考虑到。

    结对开发照:

    源代码:

     1 //求一维数组的最大子数组 王文奇 缪金敏 2016/3/23
     2 #include<iostream>
     3 using namespace std;
     4 
     5 int max(int a,int b)   //返回a和b中的最大值
     6 {
     7     if (a > b)
     8     {
     9         return a;
    10     }
    11     else
    12     {
    13         return b;
    14     }
    15 }
    16 
    17 int main()
    18 {
    19         int Array[100];
    20         int i = 1;
    21         int dynamic_planning[100][2], j, sum;
    22         int start = 0;                   //最大子数组的起始位置  
    23         int end = 0;                    //最大子数组的终止位置  
    24         cout << "请输入一组一维数组(回车结束):"<<endl;
    25         cin >> Array[0];
    26         while (cin.get() != '
    ') //回车结束
    27         {
    28             cin >> Array[i++];
    29         }
    30         //动态规划数组初始化
    31         dynamic_planning[0][0] = 0;
    32         dynamic_planning[0][1] = Array[0];
    33         for (j = 1; j<i; j++)
    34         {
    35             dynamic_planning[j][0] = max(dynamic_planning[j - 1][0], dynamic_planning[j - 1][1]);
    36             dynamic_planning[j][1] = max(Array[j], (dynamic_planning[j - 1][1] + Array[j]));
    37             //开始下标的条件:数组第二列的数前一个比现在的小且小于0且第一列的数小于等于第二列
    38             if (dynamic_planning[j - 1][1] < dynamic_planning[j][1] && dynamic_planning[j - 1][1]<0&&dynamic_planning[j][0]<=dynamic_planning[j][1])
    39             { 
    40                 start = j;
    41                 //cout << "start:"<<start << endl;
    42             }
    43             //结束下标的条件1:当前的算出的最大子数组+输入的值比下一步的最大值大于或等于
    44             if (dynamic_planning[j - 1][1] >= dynamic_planning[j][0])
    45             {
    46                 end = j - 1;
    47                 //cout << "end:" << end << endl;
    48             }
    49             //结束下标的条件2:第二列的数大于等于第一列
    50             if (dynamic_planning[j][1] >= dynamic_planning[j][0])
    51             {
    52                 end = j;
    53                 //cout << "end:" << end << endl;
    54             }
    55             
    56         }
    57         //cout << start << " " << end << endl;
    58         sum = max(dynamic_planning[i - 1][0], dynamic_planning[i - 1][1]);
    59         cout << "最大的子数组为:" << endl;
    60          for (int i = start; i <= end; i++)
    61          {
    62              cout << Array[i] << " ";
    63          } 
    64          cout << endl;
    65          cout << "最大的子数组的和为:" << sum << endl;
    66         return 0;
    67 }

    运行结果截图:

    总结:

          这次实验主要运用了动态规划的思想,再就是临界下标的判断,一定考虑到所有的情况。

    项目计划总结:

    时间记入日志:

    缺陷记入日志:

  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/qwer111/p/5316345.html
Copyright © 2011-2022 走看看