题目 1255: [蓝桥杯][算法提高]能量项链

分析题目

设:项链为\([a_0,a_1,a_2,...,a_{n-1}]\),每颗珠子的上标用\(\)h[i]\(\)来表示

即\(a_i\)的上下标分别为\(h[i]、h[(i+1)%n]\)

\(se(a_i,a_j)\)表示从\(a_i\)聚合到\(a_j\)所释放出的总能量

\(e(a_i,a_{i+1})\)表示\(a_i\)与其相邻元素\(a_{i+1}\)聚合所放出的能量,\(e(a_i,a_{i+1})=h[i]h[(i+1)%n]h[(i+2)%n]\)

其中\(i\)可以大于\(j\)也可以小于\(j\)还可以等于\(j\),比如\(se(a_0,a_3)、se(a_3,a_0)、 se(a_0,a_0)\)

问:\(se(a_0,a_n)\)的最大值

解题思路

① 尝试分解子问题

\[se(a_0,a_{n-1}) = se(a_0,a_t)+se(a_{t+1},a_{n-1})+e(a_t,a_{t+1}) \]

② 讨论其子问题

\[se(a_0,a_0) = 0 \\ se(a_0,a_1) = se(a_0,a_0)+se(a_1,a_1)+e(a_0,a_1) \\ se(a_0,a_2) = se(a_0,a_1)+se(a_2,a_2)+e(a_1,a_2)\quad or\quad se(a_0,a_0)+se(a_1,a_2)+e(a_0,a_1) \]

③ 发现求解子问题的状态转移方程为
\(\quad se(a_j,a_{(j+i-1)%n})=max(se(a_j,a_{k%n})+se(a_{(k+1)%n},a_{j+i-1})+e(a_{k%n},a_{(k+1)%n}))\quad (i表示珠子数,i\in[2,n],j\in[0,n-1]),k\in[j,j+i-1])\)
先求出横跨珠子数少的子问题,再求横跨珠子数多的子问题

代码

n = int(input())
h = list(map(int, input().strip().split()))
se = [[0 for j in range(n)] for i in range(n)]
e = lambda a, b, c: h[a] * h[b] * h[c]
for i in range(2, n + 1):
    for j in range(0, n):
        for k in range(j, j + i - 1):
            t = (j + i - 1) % n
            se[j][t] = max(se[j][t], se[j][k % n] + se[(k + 1) % n][t] + e(j,(k+1)%n,(j+i)%n))
print(max([max(i) for i in se]))
上一篇:相机的基本模型和参数


下一篇:实习报告