解题思路:
引用作者:https://blog.dotcpp.com/a/67057
观察题目,假如相邻的两个珠子,前面的珠子头坐标为m,尾坐标为r,后一个珠子头坐标为r,尾坐标为n。合并后保留了m和n,删除了r,之后r再也不能被使用,而m和n还可以在后续的合成中继续使用。
如果我们任意合并,在每次合并时都会删去一个r。如果我们删去的r是一个较大的值,那么意味着r被删除之后就再也不能参与到之后合并珠子时进行相乘的结果了。
要想得到最大的合并能量的结果,我们就要尽可能的保证较大的数能尽可能的参与到更多的珠子合并当中,而较小的数尽量较少的参与到珠子的合并当中。
那么解题方法就出现了。我们在每次合并时,我们都先删除掉数组中最小的r,直到合并到最后。这样就能得出最后的结果。
注意事项:
参考代码:
def f(n): A = [int(i) for i in input().strip().split()] ans = 0 for i in range(n-1): #n颗珠子,需要合并n-1次 min_index = A.index(min(A)) if min_index == len(A)-1: ans = ans + A[min_index-1]*A[min_index]*A[0] elif min_index == 0: ans = ans + A[-1]*A[min_index]*A[min_index+1] else: ans = ans + A[min_index-1]*A[min_index]*A[min_index+1] del(A[min_index]) print(ans) if __name__ == '__main__': n = int(input()) f(n)
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:1517 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1019 |
C语言训练-角谷猜想 (C++代码)(3N+1问题)浏览:1850 |
简单编码 (C++代码)浏览:730 |
不容易系列2 (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:781 |
【蟠桃记】 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:895 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:934 |
演讲大赛评分 (C语言代码)浏览:1696 |