题目:
有31, -41, 59, 26, 53, 58, 97, -93, -23, 84十个数。SUM(N,M)表示从第N个数到第M个数的和。如:SUM(2, 3) = -41 + 59 = 18。问:最大的和是多少? 对应的N和M是多少?
方案一:
计算所有的 SUM ,把 SUM_MAX 记录下来
方案二:
在 方案一 上改进,若前一个元素大于当前元素,则前一元素的SUM_MAX一定大于当前元素的SUM_MAX。
如 SUM(10, -2, 3) 一定大于 SUM(-2, 3)。
所以可有以下改进
方案三:
受上述方案启发,SUM_MAX(0,N-1) 的最大和是 A(1) + SUM_MAX(2,N-1)
可以得出
SUM_MAX(2,N-1) = A(1) + SUM_MAX(3,N-1)
SUM_MAX(3,N-1) = A(1) + SUM_MAX(4,N-1)
SUM_MAX(4,N-1) = A(1) + SUM_MAX(5,N-1)
.......
就是 SUM_MAX(i,N) = A(i) + SUM_MAX(i-1,N-1)
比如 SUM_MAX(7,9){-93, -23, 84} = -93 + SUM_MAX(8,9){-23, 84}
代码如下:
全部代码(copy到cpp上可以直接编译运行):