zoukankan      html  css  js  c++  java
  • 软件工程第三次作业

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

    题目(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总结
    通过这次软件工程作业,我对单元测试测试更加熟悉了,也了解了动态规划算法。
    来自一条咸鱼的忠告
  • 相关阅读:
    CGFloat,CGPoint,CGSize,CGRect
    对discuz的代码分析学习(三)mysql驱动
    对discuz的代码分析学习(二)首页文件
    对discuz的代码分析学习(一)目录结构
    获取HTML DOM
    html中如何使用特殊字体
    如何让元素自动居中
    前端分页
    页面缩放scale
    控制台获取当前年的月份列表
  • 原文地址:https://www.cnblogs.com/lwtreact/p/10740371.html
Copyright © 2011-2022 走看看