我试图解决计算数组的最大子序列和的问题,没有相邻元素是该总和的一部分。 对于第i个索引处的每个元素,我正在检查i-2和i-3元素的最大值,并将第i个元素添加到其中以获得最大值,以便两个相邻元素不包含在任何总和中。
我在递归方式下在Scala中解决了它:ideone link
/**
* Question: Given an array of positive numbers, find the maximum sum of a subsequence with the constraint that no 2 numbers in the sequence should be adjacent in the array.
*/
object Main extends App {
val inputArray = Array(5, 15, 10, 40, 50, 35)
print(getMaxAlternativeElementSum(0, 0, inputArray(0)))
def getMaxAlternativeElementSum(tracker: Int, prevSum: Int, curSum: Int):Int = tracker match {
case _ if tracker == 0 => getMaxAlternativeElementSum(tracker+1, 0, inputArray(tracker))
case _ if tracker >= inputArray.length => curSum
case _ => val maxSum = curSum.max(prevSum)
getMaxAlternativeElementSum(tracker+1, maxSum, prevSum+inputArray(tracker))
}
}
每次,我都使用递归方法将前两个总和带到下一次迭代。我可以使用任何Scala惯用语来优雅地吗?
答案 0 :(得分:1)
不确定我是否理解你想做什么,但也许这对你有用:
def getMaxAlternativeElementSum(input: Array[Int]) : Int = {
val sums =
input.zipWithIndex.fold((0, 0)) { (acc, elem) =>
elem._2 % 2 match {
case 0 => (acc._1 + elem._1, acc._2)
case 1 => (acc._1, acc._2 + elem._1)
}
}
if (sums._1 > sums._2) sums._1 else sums._2
}