1,分治思想
计算输入向量中任何连续子向量中的最大和。
[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)