7
1 2 2 7 3 6 1
3
输出:
10
说明:
第一次获取香蕉,无论是从行的开头或者末尾获取,得到的香蕉根数目为1 。但是,从行末尾获取能获取到最优的策略,后面可以直接得到香蕉根数目6和3。因此最终根数为1+6+3 = 10
思路:
- 开头和末尾数字不相等,则取较大的那头数字
- 开头和末尾数字相等,则开头和末尾都取,最后取较大的结果
const numbers = [1, 2, 2, 7, 3, 6, 1]
const count = 3
const visited = Array(numbers.length).fill(false)
function getMaxBanana(l, r, n, total) {
if (n === count) {
return total
}
let res = 0
for (let i = 0; i < numbers.length; i++) {
if (visited[i]) continue
visited[i] = true
if (numbers[l] === numbers[r]) {
res = Math.max(getMaxBanana(l, r - 1, n + 1, total + numbers[r]), getMaxBanana(l + 1, r, n + 1, total + numbers[l]))
} else {
const _l = numbers[l] > numbers[r] ? l + 1 : l
const _r = numbers[r] >= numbers[l] ? r - 1 : r
res = getMaxBanana(_l, _r, n + 1, total + Math.max(numbers[l], numbers[r]))
}
}
return res
}
console.log(getMaxBanana(0, numbers.length - 1, 0, 0))