1,分治思想
计算输入向量中任何连续子向量中的最大和。
[31,-41,59,26,-53,58,97,-93,-23,84]
直接算法:
分治思想:
将向量分解为两个子向量,求解每个向量最大和,或者最大值在子向量a和子向量b的边界处
将n向量分解为n-1和向量n
计算输入向量中任何连续子向量中的最大和。
[31,-41,59,26,-53,58,97,-93,-23,84]
直接算法:
maxsofar=0
for i = [0,n)
sum = 0
for j = [i, n)
sum += x[j]
maxsofar=max(maxsofar,sum)
分治思想:
将向量分解为两个子向量,求解每个向量最大和,或者最大值在子向量a和子向量b的边界处
float maxsum3(l,u)
if(l > u)
return 0
if(l == u)
return max(0,x[1])
m = (l + u)/2
lmax = sum = 0
for(i = m; i>=l;i--)
sum += x[i]
lmax=max(lmax,sum)
rmax=sum=0
for i = (m,u]
sum+=x[i]
rmax=max(rmax,sum)
return max(lmax+rmax,maxsum3(l,m),maxsum3(m+1,u))
最初调用如下: answer=maxsum3(0,n-1)
将n向量分解为n-1和向量n
maxsofar=0
maxendinghere=0
for i = [0,n)
maxendinghere=max(maxendinghere+x[i],0)
maxsofar=max(maxendinghere,maxsofar)