• 软件工程第三次作业


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

    一、问题描述:

    给定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。

    二、实现方法:

    算法:
    使用动态规划法,在对于上述分治算法的分析中我们注意到,若记b[j]=max(a[i]+a[i+1]+..+a[j]),其中1<=i<=j,并且1<=j<=n。则所求的最大子段和为max b[j],1<=j<=n。
    由b[j]的定义可易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。故b[j]的动态规划递归式为:b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。
    算法实现的代码: 类的定义算法的实现算法的测试
    代码:

    // ConsoleApplication2.cpp: 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <stdlib.h>
    #include<stdio.h>
    #include <iostream>
    using namespace std;
    int main()
    {
    	int count;
    	int a[100];
    	int b[100];
    	int i;
    	int max;
    	cin >> count;
    	for (i = 0; i<count; i++)
    	{
    		cin >> a[i];
    	}
    	b[0] = a[0];
    	max = b[0];
    	for (i = 1; i<count; i++)
    	{
    		if (b[i - 1]>0)
    			b[i] = b[i - 1] + a[i];
    		else
    			b[i] = a[i];
    		if (b[i]>max)
    			max = b[i];
    	}
    	printf("%d
    ", max);
    	return 0;
    }
    

    三、运行及样例测试

    在解决方案中添加单元测试

    代码运行成功后进行样例测试,选取语句覆盖的覆盖标准,通过多组测试样例覆盖所有程序语句实现对程序的测试

    测试单元的属性修改

    测试资源

    #include "stdafx.h"
    #include "CppUnitTest.h"
    #include "..ConsoleApplication2123.h"
    
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    
    namespace UnitTest1
    {		
    	TEST_CLASS(UnitTest1)
    	{
    	public:
    		
    		TEST_METHOD(TestMethod1)
    		{
    			// TODO: 在此输入测试代码
    			int count = 0;
    			int a[100] = { };
    			point t = point(a, count);
    			Assert::AreEqual(0, t.GetMax());
    		}
    		TEST_METHOD(TestMethod2)
    		{
    			// TODO: 在此输入测试代码
    			int count = 6;
    			int a[100] = { -2,11,-4,13,-5,-2 };
    			point t = point(a, count);
    			Assert::AreEqual(20, t.GetMax());
    		}
    		TEST_METHOD(TestMethod3)
    		{
    			// TODO: 在此输入测试代码
    			int count = 5;
    			int a[100] = {-1,-2,-3,-4,-5};
    			point t = point(a, count);
    			Assert::AreEqual(0, t.GetMax());
    		}
    		TEST_METHOD(TestMethod4)
    		{
    			// TODO: 在此输入测试代码
    			int count = 5;
    			int a[100] = {-4,6,9,-11,12};
    			point t = point(a, count);
    			Assert::AreEqual(16, t.GetMax());
    		}
    
    	};
    }
    

    测试结果:

    附录:

    代码连接 最大子数组和

  • 相关阅读:
    ffmpeg
    HDU 1031 Design T-Shirt
    HDU 1029 Ignatius and the Princess IV
    HDU 1022 Train Problem I
    HDU 1017 A Mathematical Curiosity
    HDU 1015 Safecracker
    HDU 1002 A + B Problem II
    HDU 1070 Milk
    高精度算法(一)
    codeblocks 使用心得
  • 原文地址:https://www.cnblogs.com/wang-bin/p/8668703.html
Copyright © 2020-2023  润新知