第四次程序(结对开发)
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。
合作伙伴:
王文奇
博客链接:http://www.cnblogs.com/qwer111/
分析:
如果按照最笨的方法就是一个一个的比较先比较一个数的然后二个,直到个数为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 }
结果展示:
总结:
这一次实验的难点就在这时间复杂度上,但是只要掌握了算法要点,这程序也就完成了。这从另一方面体现了算法的重要性。
项目计划总结:
时间记入日志:
缺陷记入日志: