测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27612. 连连看编程实现: 现在有一个连连看卡牌游戏。有n张卡牌排列在一起,每张卡牌上有一个分数,只要将相邻两张 卡牌连到一起,就会合成一张新的卡牌,卡牌上的分数为之前两张卡牌的分数之和,你将获得新 卡牌分数的相应积分。经过多次操作后,最后只剩一张卡牌,游戏结束。给定初始每张卡牌的分 数,请问最多能获得多少分?例如:场上有3张卡牌,分数分别为10分、23分、5分,将10分卡牌与23分卡牌合成,可得到 33…

填空题 中等

题目描述

连连看

编程实现: 现在有一个连连看卡牌游戏。有n张卡牌排列在一起,每张卡牌上有一个分数,只要将相邻两张 卡牌连到一起,就会合成一张新的卡牌,卡牌上的分数为之前两张卡牌的分数之和,你将获得新 卡牌分数的相应积分。经过多次操作后,最后只剩一张卡牌,游戏结束。给定初始每张卡牌的分 数,请问最多能获得多少分?

例如:场上有3张卡牌,分数分别为10分、23分、5分,将10分卡牌与23分卡牌合成,可得到 33分卡牌,再将33分卡牌与5分卡牌合成,可得到38分卡牌,获得总分数为33+38=71分为最多 的分数。

输入描述

第一行输入一个正整数n,表示有n张卡牌(1≤n≤100)。 第二行输入n个正整数,表示每张卡牌的初始分数(1≤分数≤100),正整数之间由空格隔开。 

输出描述

输出最多可以获得的分数。

输入样例

3

10 23 5 

输出样例 

71

参考答案

n = int(input())         a = [int(i) fori ininput().split()]         dp = [[0] * n fori inrange(n)]         forlength inrange(2, n + 1):                      fori inrange(n - length + 1):                         j = i + length - 1                         dp[i][j] = 0                         fork inrange(i, j):                              dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + sum(a[i:j + 1            print(dp[0][n - 1])
上一题 下一题