我正在开发codefights.com的挑战 给定一个整数数组(可能是负数)我需要返回我可以实现的最大总和而不添加两个连续的整数(我不能改变数组的顺序)。
不容易解释,所以这里有几个例子:
我虽然使用了这段代码:
function solve(vals) {
var even=0; var odd=0;
for(var i=0; i<vals.length; i++){
if(i%2==0){
even+=vals[i];
} else {
odd+=vals[i];
}
}
return Math.max(even, odd);
}
然后我得到了这个测试用例:[1,0,0,3]它应该返回4,跳过两个'0',这让我意识到我一直在看它都错了。
现在我被卡住了,不知道该怎么做。
有什么想法吗?
编辑:
使用MrGreen的回答我得到了这个:
function target_game(a) {
var dp=[], l=a.length-1;
dp[0]=a[0];
dp[1]=Math.max(a[0],a[1]);
for(var i=2; i<=a.length-1; i++){
dp[i]=Math.max(dp[i - 1], dp[i - 2] + a[i]);
}
return dp[l];
}
除非数组包含负值,否则其工作正常 此输入:[ - 1,0,1,-1]返回0。 我还在努力修复,但我正在编辑这个问题以获得防弹解决方案:p
答案 0 :(得分:4)
这是一个经典的动态编程问题。
如果我们考虑从dp[i]
到0
的元素,则将i
定义为我们可以获得的最大总和。
然后dp[i] = max(dp[i - 1], dp[i - 2] + a[i])
这背后的直觉,如果你在总和中a[i]
那么你就不能拿a[i - 1]
基本案例:dp[0] = max(0, a[0])
和dp[1] = max(0, a[0], a[1])
您可以查看本课程:
答案 1 :(得分:0)
这是&#34;最好的&#34;从挑战中回答(实际上最短):
function solve(a) {
b = t = 0
for (i in a) {
c = b + a[i]
b = t
t = c > t ? c : t
}
return t
}
这是我重命名变量以使其更易理解的版本:
function solve(vals) {
prevTotal = total = 0
for (i in vals) {
alt = prevTotal + vals[i]
prevTotal = total
total = alt > total ? alt : total
}
return total
}