[]アルゴリズムの設計と解析問題と最大サブセグメント

免責事項:この記事はブロガーオリジナル記事です。再現ブロガーの承認を連絡してください。ブロガー公共マイクロチャネル番号] [部門知るのとキャンパスを行います。https://blog.csdn.net/cxh_1231/article/details/89715854
  • 説明:これは、[コース]アルゴリズム設計と最初の質問コンピュータ科学、技術の武漢大学の第二の試験の分析は次のとおりです。最大のサブセグメントと質問
  • >>要約WUTer実験的なコンピュータサイエンスはこちら
  • 注意:紙はこの練習が不可欠である知っているZhongjue来ます。

 まず、実験対象:

与えられるn個の整数の配列A_ {1}、A_ {2}、A_ {3} ... A_ {N}......A_ {N}、フォームのシーケンスを見つける\ sum_ {k = I} ^ {J} A_ {K}全て負の整数が整数で、最大のサブセグメントがある場合、最大サブセグメントを0

第二に、実験的な要件:

1 )ブルートフォース、分割統治と最大サブセグメントアルゴリズムの動的プログラミングおよび設計の問題を使用しました。

2 )異なるアルゴリズムの性能比較の時間。

3 )テストデータ書き込みプログラムのマニュアルを提供します。

第三に、実験コード

// 实验2.1最大字段和问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include <iostream>
using namespace std;

//最大字段和:蛮力法
int MaxSum_Manli(int a[], int n){

	int sum, maxSum;
	sum = 0;
	maxSum = 0;
	int i, j, k;
	for (i = 0; i < n; i++)	{
		for (j = i; j < n; j++){
			sum = 0;
			for (k = i; k <= j; k++)
				sum += a[k];
			if (sum > maxSum)
				maxSum = sum;
		}
	}
	return maxSum;
}

//最大字段和:分治法实现
int MaxSum_Fenzhi(int a[], int left, int right) {
	int sum = 0, midSum = 0, leftSum = 0, rightSum = 0, i, j;
	int center, s1, s2, lefts, rights;
	if (left == right)                      //如果序列长度为1,直接求解
		sum = a[left];
	else {
		center = (left + right) / 2;             //划分
		leftSum = MaxSum_Fenzhi(a, left, center);          //对应情况①,递归求解
		rightSum = MaxSum_Fenzhi(a, center + 1, right);      //对应情况②,递归求解
		s1 = 0; lefts = 0;                         //以下对应情况③,先求解s1
		for (i = center; i >= left; i--){
			lefts += a[i];
			if (lefts > s1) s1 = lefts;
		}
		s2 = 0; rights = 0;                        //再求解s2
		for (j = center + 1; j <= right; j++){
			rights += a[j];
			if (rights > s2) s2 = rights;
		}
		midSum = s1 + s2;                          //计算情况③的最大子段和
		if (midSum < leftSum) sum = leftSum;           //合并解,取较大者
		else sum = midSum;
		if (sum < rightSum) sum = rightSum;
	}
	return sum;

}

//最大字段和:动态规划法
int MaxSum_Dongtai(int a[], int n){
	int sum, maxSum;
	int i;
	sum = 0;
	maxSum = 0;
	for (i = 0; i < n; i++)	{
		sum += a[i];
		if (sum > maxSum)
			maxSum = sum;
		else if (sum < 0)
			sum = 0;
	}
	return maxSum;
}

int main(){
	int a[100] = { 2,11,-4,13,-5,-2,20 };
	int n = 7;
	cout << "请输入数字串个数:";
	cin >> n;
	cout << "请依次输入 " << n << " 个数字:";
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	cout << endl;
	int sum1 = MaxSum_Manli(a, n);
	int sum2 = MaxSum_Fenzhi(a, 0, n-1);
	int sum3 = MaxSum_Dongtai(a, n);
	cout << "使用蛮力法求得:" << sum1 << endl;
	cout << "使用分治法求得:" << sum2 << endl;
	cout << "使用动态规划法求得:" << sum3 << endl;
}

第四に、結果:

 

おすすめ

転載: blog.csdn.net/cxh_1231/article/details/89715854
おすすめ