还有一个使用动态编程和函数式编程的解决方案。在javascript中:
function maxSumZeroAcc(arr, sumS, nbElt) {
//returns nbElt + the size of the longest sequence summing to sumS
if(arr.length === 0) {
return (sumS===0)?nbElt:0;
}
else {
return Math.max(maxSumZeroAcc(arr.slice(1), sumS, nbElt),maxSumZeroAcc(arr.slice(1), sumS-arr[0], nbElt+1));
}
}
function maxSumZero(arr) {
//simply calls the previous function with proper initial parameters
return maxSumZeroAcc(arr, 0, 0);
}
var myS = [1,4,6,-1,2,8,-2];
console.log(maxSumZero(myS));//returns 4
代码的核心是函数maxSumZeroAcc(arr, sumS, nbElt),它返回arr中最长序列的大小相加后的sumS——sumS和nbElt是两个辅助参数集在函数maxSumZero 中。
maxSumZeroAcc 背后的想法是,我们正在寻找的最大值是应用于数组尾部的 maxSumZeroAcc 的最大值(我们只是丢弃第一个元素)或应用于数组尾部的 maxSumZeroAcc(.,sumS-arr[0],nbElt+1) 的最大值数组(我们考虑第一个元素,而不是找到元素之和 sumS,我们寻找元素之和 sumS 减去第一个元素)。
这个解决方案写起来很短,也很容易理解,但复杂性很差,在O(2^n) 中,其中n 是数组的大小。