题目 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]))
标签:int,max,珠子,蓝桥,range,1255,项链,quad,se 来源: https://www.cnblogs.com/jawide/p/14643998.html