标签:int max 珠子 蓝桥 range 1255 项链 quad se
分析题目
设:项链为\([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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。