假设我们有一个带有正值和负值的数据列表。我们必须找到其总和最大的连续子数组的总和。假设列表包含{-2,-5,6,-2,-3,1,5,-6},则最大子数组的总和为7。它是{6,-2,-3的总和,1,5}
我们将使用分而治之方法解决此问题。步骤如下所示-
步骤 -
将数组分为两部分
查找以下三个中的最大值
左子数组的最大子数组总和
右子数组的最大子数组总和
最大子数组总和,以使子数组越过中点
#include <iostream> using namespace std; int max(int a, int b) { return (a > b)? a : b; } int max(int a, int b, int c) { return max(max(a, b), c); } int getMaxCrossingSum(int arr[], int l, int m, int h) { int sum = 0; int left = INT_MIN; for (int i = m; i >= l; i--) { sum = sum + arr[i]; if (sum > left) left = sum; } sum = 0; int right = INT_MIN; for (int i = m+1; i <= h; i++) { sum = sum + arr[i]; if (sum > right) right = sum; } return left + right; } int maxSubArraySum(int arr[], int low, int high) { if (low == high) return arr[low]; int mid = (low + high)/2; return max(maxSubArraySum(arr, low, mid), maxSubArraySum(arr, mid+1, high), getMaxCrossingSum(arr, low, mid, high)); } int main() { int arr[] = {-2, -5, 6, -2, -3, 1, 5, -6}; int n = sizeof(arr)/sizeof(arr[0]); int max_sum = maxSubArraySum(arr, 0, n-1); printf("Maximum contiguous sum is %d", max_sum); }
输出结果
Valid String
本文向大家介绍C#递归算法之分而治之策略,包括了C#递归算法之分而治之策略的使用技巧和注意事项,需要的朋友参考一下 1.分而治之的概念 分而治之是一种使用递归解决问题的算法,主要的技巧是将一个大的复杂的问题划分为多个子问题,而这些子问题可以作为终止条件,或者在一个递归步骤中得到解决,所有子问题的解决结合起来就构成了对原问题的解决 2.分而治之的优点和缺点 分而治之算法通常包括一个或
我必须在C++中为函数实现分治算法,该函数返回数组中的最大值。我理解算法并已经设计了函数,但我遇到了数组索引的问题。 在伪代码中,下面是我的函数: 有没有办法找到这些导致正确行为的指数?我很感激你的帮助。
假设坐标(x1,y1)上的一个点支配另一个点(x2,y2)如果x1≤x2,y1≤y2; 我有一组点(x1,y1),...(xn,yn),我想找到支配对的总数。我可以通过比较所有点来使用蛮力,但这需要时间O(n2)。相反,我想使用分而治之的方法在时间O(n log n)中解决这个问题。 现在,我有以下算法: 所以y坐标的两个半部分是:{1,3,4,5,5}和{5,8,9,10,12} 我画分界线。
对不起,我有一个任务要用蛮力算法O(n^2)、分治算法O(nlogn)和Kadane算法O(n)来解决最大子数组问题。(我的代码不同)。
免责声明:我知道这个问题可以通过数组的单次传递非常有效地解决,但我对用分而治之法做这个很感兴趣,因为它与我们用分而治之法处理的典型问题有点不同。 假设给定一个浮点数组x[1:n],大小为n,间隔长度为l。问题是设计一个分治算法,从具有最大和的数组中找到长度为l的子数组。 现在,为了将问题分成两半,我决定在n-l+1/2处中断数组,以便将相等数量的子数组分配到我的除法的两半,如下面的算法所示。同样,
对于使用分治方法的最大和子数组算法,我需要返回和和子数组。 我能在所有的测试中正确地计算和。然而,我无法计算出正确的子数组。 我的总数(正确):34 阵列:2 9 8 6 5-11 9-11 7 5-1-8-3 7-2 正确子数组:2 9 8 6 5 我的总数(正确):50 阵列:31-41 59 26-53 58 97-93-23 84 正确子数组:59 26-53 58 97 我的总数(正确)