最大连续子数组和(最大子段和)
题目(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;
}
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 |
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总结
通过这次软件工程作业,我对单元测试测试更加熟悉了,也了解了动态规划算法。