1,
给定一个长度为n的一维数组a,请找出此数组的一个子数组,使得此子数组的
和sum=a[i]+a[i+1]+……+a[j]最大,其中i>=0,i<n,j>=i,j<n,
例如 31 -41 59 26 -53 58 97 -93 -23 84
子矩阵59+26-53+58+97=187为所求的最大子数组。
实例代码:
#include <iostream>
using namespace std ;
//直接穷举法,求出所有可能的组合和 O(N^3)
int getSum1(int a[],int N)
{
int max=-10000000;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
{
int tmp=0;
for(int k=i;k<=j;k++)
tmp+=a[k];
if(tmp>max)
max=tmp;
}
}
return max;
}
//带记忆的递推法 O(N^2)
int getSum2(int a[],int N)
{
int* cumarr=new int[N];
cumarr[0]=a[0];
//预处理,使得求组合的和更容易
for(int i=0;i<N;i++)//首先生成一些部分和
{
cumarr[i]=cumarr[i-1]+a[i];
}
int max=-10000000;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
{
//优化的地方
int tmp=cumarr[j]=cumarr[i];
if(tmp>max)
max=tmp;
}
}
delete[] cumarr;
return max;
}
//第三种,
int maxSubArray(int a[],int N)
{
int b=0,max=-10000000;
for(int i=0;i<N;i++)
{
if(b>0) b+=a[i]; //大于0,则将之前的累加
else b=a[i];
if(b>max) max=b;
}
return max;
}
int main ()
{
int a[]={31,-41,59,26,-53,58,97,-93,-23, 84};
int N=sizeof(a)/sizeof(a[0]);
cout<<getSum1(a,N)<<endl;
cout<<getSum1(a,N)<<endl;
cout<<maxSubArray(a,N)<<endl;
return 0 ;
}
2,
分享到:
相关推荐
利用C语言可以实现对数组的各种操作,如输入数组元素,输出数组元素、求数组元素平均值、输出数组元素最大值、输出数组元素最小值、查找某数值元素是否存在、给数组元素排序等功能。本压缩文件中是上述功能对应的...
其元素和为 4+5+5+3 = 17,这是矩阵中所有可能子矩阵中的最大和。 解决这个问题的关键在于使用动态规划(Dynamic Programming, DP)方法。我们可以使用 Kadane's Algorithm 的变体来解决这个问题,该算法通常用于...
动态规划之连续子数组的最大和 连续子数组的最大和是动态规划中的一个经典问题,它们要求我们在给定的数组中找到一个连续的子数组,使得该子数组的和最大。这种问题的解决方法有很多,我们今天将介绍两种不同的方法...
最大子数组和是一道经典的算法问题,其目的是在一个数组中找到一个连续的子数组,使得该子数组的和最大。最大子数组和问题可以通过动态规划算法来解决,时间复杂度为O(n),其中n为数组长度。 最大子数组和的具体...
最大连续子序列是所有连续子序列中元素和最大的一个。 例如,给定序列 { -2, 11, -4, 13, -5, -2 },其最大连续子序列为 { 11, -4, 13 },最大和为 20。在今年的数据结构考卷中,要求编写程序得到最大和,现在增加...
C语言程序设计-编写程序。...⑴求出这8个数据的和、最大值、最小值及平均值。 ⑵求这8个数据的正数之和、负数之和(或正数与负数的个数); ⑶求这8个数据的奇数之和、偶数之和(或奇数与偶数的个数)。
这是一个经典的算法问题,目标是在一个整数数组中找到具有最大和的连续子数组。动态规划解决方案的核心思想是维护两个变量:`max_current`和`max_global`。`max_current`表示到当前位置为止的最大子段和,而`max_...
最后,我们输出了最大和和对应的子数组的起始和结束位置。 这个算法的时间复杂度为O(n),其中n是数组的长度。空间复杂度为O(1),因为我们只使用了几个变量来记录相关信息。 此外,本文还提供了一些相关的Java算法...
最大字段和问题,也常被称为“最大子序列和”或“连续子数组最大和”,是计算机科学中的一个经典算法问题,特别是在数据结构和算法的学习中占有重要地位。它要求从一个给定的整数数组中找出一个连续子数组,使得其...
逆序对是排序数组中的一种概念,它是指在数组中,如果两个元素a和b的值满足a > b,但它们的下标i ,则称(a, b)为一个逆序对。逆序对的数量可以反映出数组的有序程度,是许多算法问题的基础,如快速排序、归并排序等...
然后,对于每个行和列,比较a和b中的非零元素,如果两个元素的行标和列标相同,并且值相加不超过最大值,那么将其相加,否则,将其分开存储。最后,将结果存储到一个新的十字链表对象中。 稀疏矩阵的乘法 稀疏矩阵...
前缀和是一种数组中某元素之前(包括此元素)的所有元素的和,可以用来快速计算区间和。差分是将当前元素与前一个元素相减,应用于解决累加问题。树状数组是一种数据结构,用于快速计算区间和和单点修改,可以应用于...
另一道相似的题目要求在数组中找到连续子数组的最大和,但要求如果最大和相同,优先选择最短的子数组。这个问题可以通过在计算最大和的同时记录子数组的长度来解决。然而,题目中提到作者在这个问题上遇到了困难,...
差分矩阵是指矩阵中每个元素减去其上一个元素和左一个元素的差。设矩阵a:a[i][j],则其差分矩阵b:b[i][j] = a[i][j] - a[i-1][j] - a[i][j-1] + a[i-1][j-1]。差分矩阵的应用之一是解决矩阵中的某个子矩阵的元素的...
最大子序列和问题可以描述为:给定一个序列{ N1, N2, ..., NK },找到其中的最大连续子序列,使其元素和最大。例如,给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为 20。 为了...
FILL从键盘输入一个数字组成的字符串将字符串转换成十进制数.CFILL二维数组...和和偶数之和.CFILL求cmn.CFILL求fabonacci数列前20项的值.CFILL求m和n之间既能被3又能被7整除的整数的和.CFILL求M行N列的二维数组中每行的...
差分数组是一种特殊的树状数组,可以快速地计算区间的和和差异。我们可以使用 Sigma 函数来计算数组中 1 到 x 的和。 long long Sigma(long long *arra,long long x) //数组中 1 到 x 的和 { long long ans=0; ...
1. 找到数组中任意m个连续元素的乘积的最大值,即最大m段乘积。 2. 找到数组中任意m个连续元素的和的最小值,即最小m段和。 ### 二、动态规划解决策略 #### 最大m段乘积的动态规划解法 我们用`f(i, j)`表示以数组...
在处理数组时,我们还可以进行各种操作,如交换元素、查找最大值和最小值、计算平均值和和,甚至对数组进行排序。例如,要找到数组中的最大值和最小值,可以使用两个变量`min`和`max`来跟踪当前的最小值和最大值,...
这些方法使用简单的循环遍历数组,比较数组元素的大小,找到最大值和最小值。 三、获取数组的最大值和最小值的下标 获取数组的最大值和最小值的下标是数组操作中的一种常用操作。该工具类提供了两个方法,...