def solution(n, a): prefix = [0] * n suffix = [0] * n for i in range(n): prefix[i] = sum(a[:i+1]) for i in range(n-1, -1, -1): suffix[i] = sum(a[i:]) max_contrib = 0 for i in range(n): for j in range(n): if i != j: dist = min(abs(i - j), n - abs(i - j)) ai_plus_aj = (prefix[i] - prefix[i-1] if i > 0 else a[i]) + (suffix[j] - suffix[j+1] if j < n-1 else a[j]) contrib = ai_plus_aj * dist if contrib > max_contrib: max_contrib = contrib return max_contrib if name == 'main': print(solution(n = 3, a = [1, 2, 3]) == 5) print(solution(n = 4, a = [4, 1, 2, 3]) == 12) print(solution(n = 5, a = [1, 5, 3, 7, 2]) == 24) 算法思路 这个问题要求找到数组 a 中两个不同元素 a_i 和 a_j,使得 (a_i + a_j) * dist 最大,其中 dist 是 i 和 j 之间的最短距离(考虑环形数组,即首尾相连的情况)。 步骤解析: 预处理前缀和和后缀和: 前缀和 prefix[i] 表示数组 a 从索引 0 到索引 i 的所有元素之和。 后缀和 suffix[i] 表示数组 a 从索引 i 到数组末尾的所有元素之和。 这两个数组用于快速计算任意两个元素之和 a_i + a_j,而无需每次都重新计算。 计算最短距离: 在环形数组中,两个索引 i 和 j 之间的最短距离可以是 abs(i - j) 或者 n - abs(i - j),取这两者中的较小值。 遍历数组: 使用两层循环遍历数组 a 中的所有元素对 (a_i, a_j),其中 i != j。 对于每一对 (i, j),计算 a_i + a_j 和 dist,然后计算贡献值 contrib = (a_i + a_j) * dist。 更新最大贡献值: 遍历过程中,不断更新最大贡献值 max_contrib。 返回结果: 返回最大的贡献值 max_contrib。