`
love19820823
  • 浏览: 958371 次
文章分类
社区版块
存档分类
最新评论

借助 求 一个序列中最大和子序列 学习 分治算法 code in C#

 
阅读更多

数组为: int[] args = { -2, 11, -4, 13, -5, 2, -5, -3, 12, -9 };

最大和为:21

分治(devide-and-conquer):

其想法是把问题分成两个大致相等的子问题,然后递归地对他们求解,这是“分”的部分。“治”阶段将两个子问题的解修补到一起并可能再做些少量的附加工作,最后得到整个问题的解。

对于上面的测试数据被分成两组 {-2, 11, -4, 13,-5} ;{ 2, -5, -3, 12, -9}。最终结果存在种可能:在left数组中;在right数组中;找到包含 left最后一个元素(在例子中是 -5 )在 left 的最大子序列(例子中是 11, -4, 13,-5)和包含 right起始元素(2 )在 Second 的最大子序列( 2, -5, -3, 12)然后相加的结果。

下面我把我简要写的C#测试代码粘贴如下:


/// <summary>
/// 分治 算法
/// </summary>
/// <param name="a">A.</param>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns></returns>
int getMaxSumUsingDivideConquer(int[] a, int left, int right)
{
if (left == right)
{
if (args[left] > 0)
{
return args[left];
}
else
{
return 0;
}
}

int center = (left + right) / 2;

int maxLeftSum = getMaxSumUsingDivideConquer(a, left, center);

int maxRightSum = getMaxSumUsingDivideConquer(a, center + 1, right);

int maxLeftBorderSum = 0, leftBorderSum = 0;
for (int i = center; i >= left; i--)
{
leftBorderSum += a[i];

if (leftBorderSum > maxLeftBorderSum)
{
maxLeftBorderSum = leftBorderSum;
}
}

int maxRightBorderSum = 0, RightBorderSum = 0;
for (int i = center + 1; i <= right; i++)
{
RightBorderSum += a[i];

if (RightBorderSum > maxRightBorderSum)
{
maxRightBorderSum = RightBorderSum;
}
}

return GetMaxValueFromTreeNumber(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum); // 判断三个数最大值的函数

}

/// <summary>
/// Gets the max value from tree number.
/// </summary>
/// <param name="maxLeftSum">The max left sum.</param>
/// <param name="maxRightSum">The max right sum.</param>
/// <param name="third">The third.</param>
/// <returns></returns>
private int GetMaxValueFromTreeNumber(int maxLeftSum, int maxRightSum, int third)
{
int max = 0;
if (max < maxLeftSum)
{
max = maxLeftSum;
}
if (max < maxRightSum)
{
max = maxRightSum;
}
if (max < third)
{
max = third;
}

return max;
}

具体调用方法如下:

int total = getMaxSumUsingDivideConquer(args, 0, args.Length - 1);

MessageBox.Show("the value of maxSum is:" + total.ToString());

分享到:
评论

相关推荐

    算法实习:分治算法求n个数的数组中找出第二个最大元素

    分治(Divide and Conquer)是一种重要的算法设计策略,它通过递归地将一个问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单地直接求解,原问题的解即为子问题的解的合并。分治法通常包含三个步骤...

    计算机算法分析与设计最大连续子序列

    在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。 该问题的输入测试用例包含若干测试用例,每个测试用例占 2 行,第 1 行给出正整数 K (),第 2 ...

    分治算法求最大值与最小值,找最小元素

    分治算法是一种重要的计算机科学中的算法设计思想,它将一个复杂的问题分解成多个规模较小的相同或相似的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。这种策略有助于简化问题处理,提高...

    最长公共子序列算法C#实现

    在LCS问题中,我们从两个序列的末尾开始,比较当前字符是否相等,如果相等则添加到当前子序列中,否则尝试去掉一个序列的一个字符,继续比较。如果找不到符合条件的子序列,回溯到上一步。这个过程可以通过递归实现...

    分治法求解序列最大最小元素【算法设计与分析】

    在“分治法求解序列最大最小元素”的问题中,我们将探讨如何利用这种策略找到一个序列中的最大值和最小值。 首先,分解阶段,我们需要将给定的序列分割成两个或更多的子序列,每个子序列大约包含原序列的一半元素。...

    分治法求最大子段和的问题

    最大子段和问题描述:给定由n个整数(可能为负整数)组成的序列a1, a2,…, an, 求该序列形如的子段和的最大值。当所有整数均为负整数时定义其最大子段和为0。依次定义,所求的最优值为: 例如, 当(a1,a2, a3, a4...

    最大子段和(分治法)源码

    最大子段和问题是指给定一个由 n 个整数(可能有负整数)组成的序列(a1, a2, …, an),求该序列中的最大子段和。 知识点: 1. Maximum Subarray Problem:最大子段和问题是指给定一个由 n 个整数(可能有负整数...

    算法实验-串匹配问题-采用分治法求解最大连续子序列和问题-用分治策略求众数问题-最近点对问题

    在本实验中,我们将探讨四个核心的算法问题:串匹配问题、最大连续子序列和问题、求众数问题以及最近点对问题。这些问题都属于算法设计与分析的范畴,通过解决这些问题,我们可以深入理解分治法和其他算法策略。 1....

    求出最长上升子序列中各个元素

    在算法领域,最长上升子序列(Longest Increasing Subsequence,LIS)问题是一个经典的问题,它在计算机科学中有着广泛的应用,例如在数据结构、排序算法以及动态规划等方面。本篇将详细介绍如何找出一个序列中长度...

    求解子序列的最大和问题

    文件给出了四种方式求解子序列的最大和,并给出了具体的代码实现。对于深入探讨算法和程序性能非常有帮助。

    C#,最大公共子序列(LCS,Longest Common Subsequences)的算法与源代码

    C#,最大公共子序列(LCS,Longest Common Subsequences)的算法与源代码 最长的常见子序列问题是寻找两个给定字符串中存在的最长序列。 最大公共子序列算法,常用于犯罪鉴定、亲子鉴定等等的 DNA 比对。 1.1 子...

    最长公共子序列,分治法,算法C++

    最长公共子序列(Longest Common Subsequence,LCS)问题是一个经典的计算机科学问题,它涉及到序列比较和字符串处理。在给定的两个序列X和Y中,LCS是指既存在于X也存在于Y的一个子序列,且长度最长。解决这个问题...

    算法分析与设计实验-实验一 递归与分治算法设计

    在实验的`MERGE`函数中,通过递归地拆分序列,直到子序列只剩一个元素,然后逐步合并这些有序子序列。 ```c for(i = 0; i ; i++) { // ... } ``` 实验环境基于Windows 7以上操作系统,使用PC机和Code::Blocks...

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...

    算法分析与设计.最近对问题.最大子段和(分治法最大子段和(动态规划)

    最近对问题最大子段和(分治法)是算法设计与分析中一个重要的知识点,它可以通过分治法和动态规划来解决,并且在实际应用中有广泛的应用前景。 关键词:算法设计与分析、最近对问题、最大子段和、分治法、动态规划...

    低买高卖分治算法

    - 接着,在“治”阶段,我们比较两个子序列中的最高卖出价格,并选择较高的那一个作为整个序列的最大利润。这一步可以通过维护两个子序列的局部最高和最低值来实现。 - 为了保证O(n log n)的时间复杂度,可以使用...

    最长公共子序列c#学习案例(完整版)含Excel数据分析

    这个算法可以应用到文字录入测试的应用中,测试文字录入内容,常用的处理方法是关键字检测发,通过检测word文件中的关键字,可以测出考生操作的大概结果,但是很不准确,利用最长公共子序列算法进行文字录入测试,...

    分治算法实验(用分治法查找数组元素的最大值和最小值).doc

    分治算法实验(用分治法查找数组元素的最大值和最小值).doc

    最大子段和问题 蛮力法 分治法 动态规划法

    最大子段和问题是一个经典的计算机科学中的算法问题,它的目标是找到一个整数数组中连续子数组的最大和。这个问题在很多实际应用中都有所体现,比如在数据分析、股票投资策略等领域。下面我们将深入探讨解决这一问题...

Global site tag (gtag.js) - Google Analytics