ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-04-11 15:33:25  阅读:283  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有