题解(枚举)

在每个方案中,我们需要选择一组相邻元素做乘法,而剩余元素做加法。一开始用前缀和求前后两段加法的值,其实没必要,只需要从整体和 sum 中减去做乘法的两个元素就好了。

fun main(args: Array<String>) {
    val n = nextInt()
    val nums = nextArrayI(n)
    val sum = nums.fold(0L) { it, arr -> it + arr }
    var ret = sum
    for (i in 1 until n) {
        ret = max(ret, sum - nums[i] - nums[i - 1] + 1L * nums[i] * nums[i - 1])
    }
    println(ret)
    done()
}

复杂度分析:

  • 时间复杂度: 预处理整体和和枚举的时间都是
  • 空间复杂度: nums 数组空间。