数组中最大的总和,不添加2个连续值

时间:2015-07-23 09:00:44

标签: javascript arrays challenge-response

我正在开发codefights.com的挑战 给定一个整数数组(可能是负数)我需要返回我可以实现的最大总和而不添加两个连续的整数(我不能改变数组的顺序)。

不容易解释,所以这里有几个例子:

  • 输入:[1,2,3,4]:你要通过'1',拿2,不能拿3,拿4,你得6。
  • 输入:[1,3,1]:传递'1',取3,你不能拿1,所以你有3。

我虽然使用了这段代码:

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

2 个答案:

答案 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])

您可以查看本课程:

part-1 part-2 part-3 part-4

答案 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
}