试题 算法提高 能量项链


问题描述
  在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为mrn(Mars单位),新产生的珠子的头标记为m,尾标记为n。
  需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
  例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:
  (4⊕1)=1023=60。
  这一串项链可以得到最优值的一个聚合顺序所释放的总能量为
  ((4⊕1)⊕2)⊕3)=1023+1035+10510=710。
输入格式
  输入的第一行是一个正整数N(4≤N≤100),表示项链上珠子的个数。第二行是N个用空格隔开的正整数,所有的数均不超过1000。第i个数为第i颗珠子的头标记(1≤i≤N),当i<N时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于第1颗珠子的头标记。
  至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
输出格式
  输出只有一行,是一个正整数E(E≤2.1*109),为一个最优聚合顺序所释放的总能量。
样例输入
4
2 3 5 10
样例输出
710
思路:
本题思路和合石头很像他们都是dp区间,我们知道如何想知道3个数的最大总能量的话需要前二项和后一项的最大能量加他们2个珠子的的合成能量,或者前一项和后2项的最大能量加他们2个珠子的的合成能量就是当前的值了。我们把珠子数存到c列表中。
我们知道我们的开头和结尾是不固定的,因为他是一个圆的选择。当我们选的长度是1-n,不可以超过当前珠子的数。我们知道选珠子开头的位置可以是0-n。尾部=长度+开头位置。
我们就可以建立一个dp[i][j] ,表示i-j的区间的最大能量值。
以上述可知我们开头就是i 结尾就是j=i+l 我们需要优化空间那么我们就可以(i+l)%n即可。
我们知道要把当前i-j的长度分为2份了计算第3份的最大能量 。那么k就是断点。k=(k%n)优化空间。
我们知道前半选择是i到k 后面一半就是k+1到j 用dp表示就是 dp[i][j]+dp[(k+1)%n][j] 我们已经半他们前半的和后半的能量值已经计算出来了,那么要加他们2个和成的能量 那么计算就是:

c[i]*c[(k+1)%n]*c[(j+1)%n]

那我们就真的此程序的方程式就是:
dp[i][j]=max(dp[i][j],dp[i][k]+dp[(k+1)%n][j]+c[i]*c[(k+1)%n]*c[(j+1)%n])
我们知道珠子是圆的所以需要把i的头到i+n的dp值判断出最大的能量即可。
程序:

n=int(input())
c=list(map(int,input().split()))  #存储珠子数
dp=[[0 for i in  range(n+5)] for i in range(n+5)]  #初始化for l in  range(1,n):  #长度for i in range(0,n):  #开头的选择j=(i+l)%n  #  结尾for k in range(i ,i+l):  #断点位置k=k%ndp[i][j]=max(dp[i][j],dp[i][k]+dp[(k+1)%n][j]+c[i]*c[(k+1)%n]*c[(j+1)%n])cot=0
for i in range(n):  #开头位置j=(i+n-1)%n  #结尾位置cot=max(cot,dp[i][j])  #判断最大能量
print(cot)

禁止转载。仅用于自己学习。对程序错误不负责。

试题 算法提高 能量项链相关推荐

  1. Java实现 蓝桥杯VIP 算法提高 能量项链

    算法提高 能量项链 时间限制:1.0s 内存限制:256.0MB 问题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记 ...

  2. 短时能量法代码c语言,[蓝桥杯][算法提高]能量项链 (Python代码)

    # Python求解能量项链 对于这个题,刚入手可能题目就会吸引到很多朋友,翱翔Mars星:joy:,哈哈哈.进入正题,一般这个题的第一印象就是采用双向链表,但是不需要这么难,你只需要构造一个伪的循环 ...

  3. [蓝桥杯][算法提高]能量项链(区间dp)

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有 N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一 ...

  4. 蓝桥杯试题 算法提高 扶老奶奶过街(C语言)

    试题 算法提高 扶老奶奶过街(C语言) 资源限制 时间限制:1.0s 内存限制:256.0MB 一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: ...

  5. 蓝桥杯 试题 算法提高 P0402 猴子吃桃问题 Java

    试题 算法提高 P0402 资源限制 时间限制:1.0s   内存限制:256.0MB 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个. ...

  6. 试题 算法提高 成绩排名

    试题 算法提高 成绩排名  Lan   2020-03-28 22:34   363 人阅读  0 条评论 资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 小明刚经过了一次数学考 ...

  7. 蓝桥试题 算法提高 矩阵翻转

    21-22-1蓝桥训练1 D.试题 算法提高 矩阵翻转 问题描述: Ciel有一个N*N的矩阵,每个格子里都有一个整数.N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从 ...

  8. 蓝桥试题 算法提高 打包(二分法,最大值最小化)

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重.Lazy希望每个人得到的礼物的编号都是连续的.为了 ...

  9. 蓝桥杯试题 算法提高 转圈游戏 C/C++

    试题 算法提高 转圈游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最 ...

最新文章

  1. 关于 Git 提交这些规范,你都遵守了吗?
  2. c++ map 析构函数_C++学习刷题6--C++类的使用:构造函数、析构函数和类的使用
  3. 记crontab脚本未执行问题排查
  4. C++设计模式之Adapter
  5. filebeat配置介绍
  6. sprintf_s用法c语言,sprintf_s函数的使用
  7. ubuntu 扫描局域网ip
  8. BAT等大厂年薪30W+面试清单:JVM\MySQL\设计模式\分布式\微服务
  9. JSONP实现跨域(9种跨域方案)
  10. python SMAP_level2c nc 文件做线性拟合:y=ax+b
  11. 前端实现在线预览文档(pdf、doc文件)
  12. MTF SFR 简介
  13. Cordova 拨打电话_Cordova 项目开启拨打电话
  14. java base是什么文件_JavaBase 面向对象
  15. shell一键安装lnmp
  16. 百度开源Mesa TEE通用安全计算平台介绍。
  17. STM32那些你该知道的事儿-第3季第1部分视频课程-朱有鹏-专题视频课程
  18. 火狐安全软件Huohong
  19. 智能合约和去中心化应用DAPP
  20. #分析方法#波士顿矩阵

热门文章

  1. 蓝讯和杰理哪个比较好_TWS耳机迎来标准化,杰理蓝讯龙头地位或不保,络达恒玄正崛起...
  2. android自定义流式布局思路,Android 自定义控件基础-流式布局
  3. 解决“psycopg2.errors.InsufficientPrivilege: permission denied for table”问题
  4. 如何长URL转换为短URL
  5. iPhone5 谣言盘点
  6. 从零开始实现JAVA微信公众号支付
  7. Git的下载、安装和使用一条龙
  8. 有风阻的非自由落体的速度求解之路
  9. NSIS 改注册表
  10. c语言入门 day7