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 }

    运行结果截图:

    总结:

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

    项目计划总结:

    时间记入日志:

    缺陷记入日志:

  • 相关阅读:
    华科机考:特殊排序
    华科机考:排序
    华科机考:字符串连接
    华科机考:a+b
    华科机考:IP地址
    华科机考:统计单词
    iOS 应用评分
    jQuery Custom PopUp Window
    Csharp:字符串操作
    Css:Conditional comments 条件注释
  • 原文地址:https://www.cnblogs.com/qwer111/p/5316345.html
Copyright © 2011-2022 走看看