题目 1255: [蓝桥杯][算法提高]能量项链
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了题目 1255: [蓝桥杯][算法提高]能量项链,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1321字,纯文字阅读大概需要2分钟。
内容图文
分析题目
设:项链为\([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]))
内容总结
以上是互联网集市为您收集整理的题目 1255: [蓝桥杯][算法提高]能量项链全部内容,希望文章能够帮你解决题目 1255: [蓝桥杯][算法提高]能量项链所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。