博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
软件工程第三次作业!
阅读量:6038 次
发布时间:2019-06-20

本文共 2693 字,大约阅读时间需要 8 分钟。

1.题目要求

最大连续子数组和(最大子段和)

问题描述: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

2.程序设计

2.1程序设计思想:(动态规划思想)

状态方程 : max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] )

上面式子的意义是:我们从头开始遍历数组,遍历到数组元素 arr[ i ] 时,连续的最大的和 可能为 max( dp[ i -1 ] ) + arr[ i ] ,也可能为 arr[ i ] ,做比较即可得出哪个更大,取最大值。时间复杂度为 n。

2.2程序代码

#include
using namespace std;int GetMax(int a, int b) //得到两个数的最大值{ return (a) > (b) ? (a) : (b);}int GetMaxAddOfArray(int* arr, int sz){ if (arr == NULL || sz <= 0) return 0; int tem = 0; for (int i = 0; i < sz; i++) { if (arr[i] < 0) tem++; } if (tem == sz) return 0; else { int Sum = arr[0]; //临时最大值 int MAX = arr[0]; //比较之后的最大值 for (int i = 1; i < sz; i++) { Sum = GetMax(Sum + arr[i], arr[i]); //状态方程 if (Sum >= MAX) MAX = Sum; } return MAX; }}int main(){ int array[] = { -1,-3,4,6,-2,6,-1,0 };//2, 3, -6, 4, 6, 2, -2, 5, -9 int sz = sizeof(array) / sizeof(array[0]); int MAX = GetMaxAddOfArray(array, sz); cout << MAX << endl; return 0;}

3.测试程序

3.1逻辑图的设计

1646658-20190414151455958-1031266442.png

3.2判定/条件覆盖测试
First Second Third Fourth Fifth Sixth
arr数组为空 arr[i]<0 i<sz tem==sz j<sz Sum>=Max
arr数组不为空 arr[i]>=0 i>=sz tem!=sz j>=sz Sum<Max

3.3样例的选择

3.3.1

样例1:arr{};

3.3.2

样例2:arr{4}={-1,-2,-3,-4};

3.3.3

样例3:arr{8}={-1,-3,4,6,-2,6,-1,0};

3.4测试程序代码
#include 
#include
extern int GetMaxAddOfArray(int* arr, int sz);using namespace Microsoft::VisualStudio::CppUnitTestFramework;namespace UnitTest1{ TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { int *array = {}; int sz = sizeof(array) / sizeof(array[0]); int Max=GetMaxAddOfArray(array,sz); Assert::AreEqual(Max,0); } TEST_METHOD(TestMethod2) { int array[]= { -1,-2,-3,-4 }; int sz = sizeof(array) / sizeof(array[0]); int Max = GetMaxAddOfArray(array,sz); Assert::AreEqual(Max,0); } TEST_METHOD(TestMethod3) { int array[]= { -1,-3,4,6,-2,6,-1,0 }; int sz = sizeof(array) / sizeof(array[0]); int Max = GetMaxAddOfArray(array,sz); Assert::AreEqual(Max,14); } };}

4.测试结果

测试结果一开始由于对数据设置的出错导致其中有一个测试样例出错,如下图所示:

1646658-20190414152453484-2142744139.png

后来经更正三组测试用例全部通过,如下图所示:

1646658-20190414152549165-1360642713.png

5.心得体会

It is obvious that:A little care in each step will shorten the time and improve the efficiency!

转载于:https://www.cnblogs.com/ltc0504/p/10705350.html

你可能感兴趣的文章
Docker 清理命令
查看>>
利用NRPE外部构件监控远程主机
查看>>
使用模块化编译缩小 apk 体积
查看>>
router-link传参
查看>>
ios之UISlider
查看>>
短信验证流程
查看>>
php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别
查看>>
OpenCV Error: Assertion failed (data0.dims <= 2 && type == 5 && K > 0) in cv::kmeans
查看>>
python string 之 format
查看>>
树形DP 复习
查看>>
Vuex随笔
查看>>
crontab 不执行
查看>>
避免用for循环写数据
查看>>
Dijkstra(变形) POJ 1797 Heavy Transportation
查看>>
关于Webpack详述系列文章 (第三篇)
查看>>
关于Webpack详述系列文章 (第四篇)
查看>>
分布式系统的面试题15
查看>>
个人代码库の创建快捷方式
查看>>
由strcat函数引发的C语言中数组和指针问题的思考
查看>>
无锁编程
查看>>