求一维数组的最大子数组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() != '\n') //回车结束
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 }

运行结果截图:

总结:

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

项目计划总结:

时间记入日志:

缺陷记入日志:

 

posted @ 2016-03-24 17:18  斗破2  阅读(223)  评论(1编辑  收藏  举报