软件工程第三次作业

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

题目(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函数流程图

函数流程图如下:
1539949-20190420121754537-254530308.jpg

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测试代码
#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测试结果

1539949-20190421123040439-1087338308.png

4总结

通过这次软件工程作业,我对单元测试测试更加熟悉了,也了解了动态规划算法。

转载于:https://www.cnblogs.com/lwtreact/p/10740371.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值