软件工程第三次作业

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

题目(1):最大连续子数组和(最大子段和)

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程序设计

       数组arr表示输入的数组,dp[i]表示以 A[i] 作为末尾的连续序列的最大和。可以得到递推公式:dp[i] = max{A[i], dp[i-1]+A[i]} 。通过Maximum函数来执行求最大连续子数组和,通过主函数进行输入输出。

2.1函数流程图

函数流程图如下:

2.2源代码

#include <iostream>
#define MAX 10000
using namespace std;
int n,arr[MAX], dp[MAX];
int Maximum(int arr[], int n)
{
	int sum = -MAX,flag=0;
	for (int i = 0; i < n; i++) {
		if (arr[i] < 0){
			flag++;
		}
		if (flag == n)
				return 0;
	}
	if (n == 0)
		return n;
	dp[0] = arr[0];
	for (int i = 1; i < n; i++) {
		dp[i] = arr[i] > dp[i - 1] + arr[i] ? arr[i] : dp[i - 1] + arr[i];
	}
	for (int i = 0; i < n; i++) {
		sum = sum > dp[i] ? sum : dp[i];
	}
	return sum;
}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	if (n <= 0)
		cout << 0;
	else
		cout << Maximum(arr, n);
	return 0;
}

CODING源代码

3单元测试

3.1测试用例

我在单元测试中选择了条件/判定覆盖测试程序,对该程序每一个判定条件进行了测试,条件/判定覆盖路径如下。
①n<0数组为空
②n>0数组非空
③n > 0 arr[i] < 0
④n > 0 arr[i] > 0
测试用例如下表

测试用例序号 测试用例 预期结果
{}0
{1,2,3}6
{1,2,3,-1,2}7
{1,-5, 4,0,1,-2}5
{-5,-1,-2,-10 }0
{1,24,-8,10,-21,7,6 }27
####3.2测试代码 ```[c++] #include "stdafx.h" #include "CppUnitTest.h" #include "../Project2/标头.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
int arr1 = {}, //0
arr2[3] = { 1,2,3 }, //6
arr3[5] = { 1,2,3,-1,2 }, //7
arr4[6] = { 1,-5,4,0,1,-2 }, //5
arr5[4] = { -5,-1,-2,-10 }, //0
arr6[7] = { 1,24,-8,10,-21,7,6 };//27

TEST_CLASS(UnitTest1)
{
public:
	TEST_METHOD(TestMethod1)
	{
		Assert::AreEqual(Maximum({}, 0), 0);
	}
	TEST_METHOD(TestMethod2)
	{
		Assert::AreEqual(Maximum(arr2, 3), 6);
	}
	TEST_METHOD(TestMethod3)
	{
		Assert::AreEqual(Maximum(arr3,5),7);
	}
	TEST_METHOD(TestMethod4)
	{
		Assert::AreEqual(Maximum(arr4, 6), 5);
	}
	TEST_METHOD(TestMethod5)
	{
		Assert::AreEqual(Maximum(arr5, 4), 0);
	}
	TEST_METHOD(TestMethod6)
	{
		Assert::AreEqual(Maximum(arr6, 7), 27);
	}

};

}

####3.3测试结果
![](https://img2018.cnblogs.com/blog/1539949/201904/1539949-20190421123040439-1087338308.png)

##4总结
通过这次软件工程作业,我对单元测试测试更加熟悉了,也了解了动态规划算法。
来自一条咸鱼的忠告
原文地址:https://www.cnblogs.com/lwtreact/p/10740371.html