最大連續子數組和(最大子段和)及其條件覆蓋

最大連續子數組和(最大子段和)問題

  • <font color=4F4F4F size=5>背景</font>   <font color=gray size=4>問題: 給定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。 -- 引用自</font><font color=pink size=4>《百度百科》</font>
  • <font color=4F4F4F size=5>具體要求</font> <font color=gray size=4>(1) 請從上述兩個題目中根據我的實力任選一題,要求寫出可運行的完整代碼提交至GitHub或者Coding.net系統中,並將代碼地址附到博客內</font> <font color=gray size=4>(2) 請從語句覆蓋、斷定覆蓋、條件覆蓋、斷定/條件覆蓋、條件組合覆蓋五個覆蓋標準中(條件組合覆蓋難度較大,鼓勵嘗試,但請謹慎選擇),任選一個標準設計測試用例</font> <font color=gray size=4>(3) 請利用自動測試工具對程序進行測試</font> <font color=gray size=4>(4) 請將程序運行結果和自動測試分析結果截圖附到博客中</font>
  • <font color=4F4F4F size=5>問題分析</font> <font color=gray size=4>    根據題目分析,須要輸入n個整數,因此設置一個自變量n,保存要輸入的整數個數,以及一維數組a[n](此處須要用指針申請動態數組),用來保存輸入的整數,因爲題目要求「當所給的整數均爲負數時定義子段和爲0」,因此輸入完成後當即判斷所輸入整數是否全爲負數,若是全爲負數,輸出‘0’;   雖然算出全部組合便找出最大子段合,可是這樣程序執行開銷過大,因此改進算法,只使用一次循環。    由於最大子段和必定是正數,這樣就排除了許多組合,因此從第一個整數開始累加,出現負數便捨棄以前的子段,從當前位置繼續向後累加子段,依次累加到最後一個整數,而此過程當中還須要另一個變量記錄到目前爲止所出現的最大子段合。    設置變量sub,max1保存子段和,初值爲0,從第一個整數開始逐個向後累加,累加值保存在變量sub中,每完成一次累加,當即比較當前sub的值與剛剛所累加整數a[i]的大小,若是sub<a[i],則將a[i]的值賦給sub,爲了找出最大子段合。須要用max1記錄最大的sub值,因此每累加一次以後都要比較max1與sub的大小,若是max1<sub,則將sub的值賦給max1,不然max1保持不變,當循環累加結束後,max1的值即爲該連續子數組最大子段和,輸出max1的值。</font>
  • <font color=4F4F4F size=5>流程圖與源代碼</font>
  1. <font color=666666 size=4>流程圖</font> ios

  2. <font color=666666 size=4>源代碼</font> </font><font color=pink size=4>點此查看Github源代碼</font>git

#include <stdio.h>
#include<iostream>
#include<cstdlib>
using namespace std;

int MAX(int n,int *a)
{
	int  m, max1=0,sub=0;
	for (m = 0; m < n; m++)
	{
		sub += a[m];
		if(sub<a[m])
		{
			sub = a[m];
		}
		if (max1 < sub)
		{
			max1 = sub;
		}
	}
	return max1;
}

int main()
{
	int i=0,max=0,n=0,button=0;
	int* a = new int[n+1];
	cin >> n;
	if (n <= 0)
	{
	cout << max;
	system("pause");
	return 0;
	}
	return 0;
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
		if (a[i] > 0)
		{
			button = 1;
		}
	}
	if (button == 0)
	{
		max = 0;
	}
	else
	{
		max = MAX(n,a);
	}
	cout << max << endl;
	system("pause");
	return 0;
}
  • <font color=4F4F4F size=5>測試用例選擇</font> <font color=666666 size=4>斷定/條件覆蓋</font>
\ A B C D
1 n<=0 a[0]_a[n]<0 sub<a[i] max1<sub
2 n>0 a[i]>0 sub>=a[I] max1>=sub
n=0;A1
n=6,a[]={-2,11,-4,13,-5,-2};A2,B2,C1,C2,D1,D2
n=6,a[]={-2,-11,-4,-13,-5,-2};A2,B1
<font color=gray size=4></font>
<font color=666666 size=4>單元測試代碼</font>
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../2/head.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{		
	TEST_CLASS(UnitTest1)
	{
	public:
		TEST_METHOD(TestMethod1)
		{
			int n = 6;
			int num[] = { -2,11,-4,13,-5,-2 };
			Assert::AreEqual(MAX(n, num), 20);
		}
		TEST_METHOD(TestMethod2)
		{
			int n = 6;
			int num[] = { -2,-11,-4,-13,-5,-2 };
			Assert::AreEqual(MAX(n, num), 0);
		}
		TEST_METHOD(TestMethod3)
		{
			int n = -1;
			int num[] = { -2,11,-4,13,-5,-2 };
			Assert::AreEqual(MAX(n, num), 0);
		}
	
	};
}

<font color=666666 size=4>測試結果圖</font> github

  • <font color=4F4F4F size=5>總結</font>   <font color=gray size=4>經過本次做業,我鞏固了課堂所學的覆蓋標準,深入理解了其概念,期待從此的學習</font>
相關文章
相關標籤/搜索