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.程序设计
程序设计采用递推法实现,每当数组中有一个新的数据进入,判断其正负,因加负数max值肯定不变,当加入正数时可能使max变大,当加入新数据使最大字段和为负数时重新计算字段和,最终得到其中最大字段和。源代码如下
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int arr[100],test[100];
int num,max;
int maxfun(int arr[],int num)
{
int max;
test[0]=arr[0];
max = test[0];
for (int i = 1; i < num; i++)
{
if (test[i - 1] > 0)
test[i] = test[i - 1] + arr[i];
else
test[i] = arr[i];
if (test[i] > max)
max = test[i];
}
if (max < 0)
max = 0;
return max;
}
int main()
{
int i;
int max;
cin >> num;
for (i = 0; i < num; i++)
{
cin >> arr[i];
}
max = maxfun(arr, num);
printf("%d\n", max);
return 0;
}
maxfun函数流程图如下
3程序测试
对于本程序采用判定/条件覆盖
程序中共有三个判断条件
序号 | 条件 |
---|---|
1 | test[i-1]>0或test[i-1]>=0 |
2 | test[i]>max或test[i]<=max |
3 | max>0或max<=0 |
测试样例如下
序号 | 测试样例 | 预期结果 |
---|---|---|
1 | (-2,11,-4,13,-5,-2) | 20 |
2 | (-2) | 0 |
测试代码如下
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../求最大字段和/标头.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
int arr1[] = { -2, 11, -4, 13, -21, -2 };
int arr2[] = { -2 };
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(maxfun(arr1, 6), 20);
}
TEST_METHOD(TestMethod2)
{
Assert::AreEqual(maxfun(arr2, 1), 0);
}
};
}