- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
算法说明:最大子数组问题给定一个由 n 个实数组成的序列 A(1) … A(n),确定一个连续的子序列 A(i) … A(j),其中子序列中的元素之和最大。
算法:
int kadane(int a[], int n)
{
int overall_sum=0; //overall maximum subarray sum
int new_sum=0; //sum obtained by including the current element
for(int i=0;i<n;i++)
{
//new_sum is the maximum value out of current element or the sum of current element
//and the previous sum
new_sum=max(a[i], new_sum+a[i]);
cout << new_sum << " : ";
//if the calculated value of new_sum is greater than the overall sum,
//it replaces the overall sum value
overall_sum=max(overall_sum, new_sum);
cout << overall_sum << endl;
}
return overall_sum;
}
我知道我们正在尝试将问题分解为小的子问题。思路是确定n-1个子序列的最大部分和,求出n个序列的最大部分和。代码对我来说看起来很清楚,因为我可以在纸上解决它以找到解决方案,但这个想法似乎很神奇。有人可以对此算法提供更好的解释吗?或者它为什么有效的证明?
最佳答案
为了 100% 准确,算法实际计算的是:非空 子序列的最大总和,对于非空 数组(对于空数组为零,这有点不一致)。对于所有数字均为负数的数组,这会有所不同 - 如果我们将空序列计算为有效,则结果应为 0。对于这种情况,算法会生成最大的负数而不是 0。
证明:
在循环开始时,new_sum
始终是结束于(不包括)a[i]
的那些序列的最大总和(因此,直到 a[i-1]
代表 i>0
,0
代表 i==0
)。通过归纳循环执行来证明。这对于 i=0
显然是正确的(new_sum == 0
这是一个空序列的总和),并且对于 i+1
也是正确的> 赋值后,因为以a[i]
结尾的最大和非空序列(即a[i+1]
之前的最后一个元素)需要include a[i]
因此是 a[i]
本身的最大值以及 a[i]
和前面序列的总和。
overall_sum
只是 a[i]
的所有 new_sum
值中的最大值,因此代表最大的全局子序列(对于某些i
它必须以 a[i]
结束,因此对所有 a[i]
进行最大化工作。
关于algorithm - 动态规划算法(Kadane),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004371/
我已经编写了 Kadane 算法,但不知何故它返回了错误的结果。不知道为什么。这是实现。基本上是在数组中找到“和最大的 ubarray” public class Kadane { publi
我将 Kadane 的算法修改为以下内容,这样即使在数组中包含所有负数的情况下它也能正常工作。 //Largest Sum Contiguous Subarray #include #include
尝试使用此处解释的 Kadane 算法:https://www.youtube.com/watch?v=OexQs_cYgAQ&t=721s 在这个数字数组中:[-5, 10, 2, -3, 5, 8
这个算法很有趣,我知道它被用于图像处理(可能还有其他场景),但我觉得奇怪的是这个算法也对负值进行操作,而负值在成像世界中几乎不存在其中有很多 unsigned int 来表示值。 您能否提供一个利用
假设 max_sequence(Array A):是 Kadane 算法的一个解。 你有一个数组:5,-3,-4,8,-1,12,-6,+4,+4,-14,+2,+8 然后将此数组缩短为正负序列的条纹
我正在研究 Kadane 的最大子数组问题算法。现在我从声明中了解到我们已经找到一个 子数组 的算法。子数组是否包含整个数组本身。 其实我在尝试下面的程序 int main(void)
算法说明:最大子数组问题给定一个由 n 个实数组成的序列 A(1) … A(n),确定一个连续的子序列 A(i) … A(j),其中子序列中的元素之和最大。 算法: int kadane(int a[
Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array (a) max
int array[] = {-1, 4, -2, 5, -5, 2, -20, 6}; 如果我有那个数组,我的 Kadane 算法实现可以找到最大子数组: int max_so_far = IN
有人可以告诉我 Kadane 算法中发生了什么吗?想检查我的理解。这就是我的看法。 你正在遍历数组,每次将 ans 变量设置为看到的最大值,直到该值变为负数,然后 ans 变为零。 与此同时,每次循环
这个问题在这里已经有了答案: Maximum sum sublist? (13 个答案) 关闭 8 年前。 我有以下 Kadane's algorithm 的实现求解数组的最大子数组问题: publ
我的算法如下所示: Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array
#include #include int MIN = std::numeric_limits::min() using namespace std ; void findMaxSubArray(
应用 Kadane 算法来获得最大乘积子数组似乎很棘手。虽然我能够获得最大乘积,但我并没有真正获得最大乘积子数组的正确范围。 http://www.geeksforgeeks.org/maximum-
我正在尝试解决 hackerrank 问题 - 最大子数组模 - 此处描述 https://www.hackerrank.com/challenges/maximum-subarray-sum/pro
这是 Kadane 算法的 Java 实现,用于查找具有最大和的连续子数组的和。 static int maxSum(int[] arr) { int maxEndingHer
我查找了寻找连续子数组最大和的最优解。还有一种算法叫做 Kadane 算法。这是我在 geeksforgeeks 上找到的伪代码。 Initialize: max_so_far = 0
我一直在尝试获取子数组的最大积的范围(为求职面试而学习)。 这已经在这里问过(但没有提供有效的答案)。 Getting range of max product subarray using Kada
public class Kadane { double maxSubarray(double[] a) { double max_so_far = 0; double max_e
我感觉Kadane的算法是最大子数组问题真动态规划解法的修改版。为什么我这么感觉?我感觉是因为计算最大子数组的方式可以采取: for(i=0;i using namespace std; int DP
我是一名优秀的程序员,十分优秀!