#932. 「一本通 5.1 例 2」能量项链
「一本通 5.1 例 2」能量项链
题目描述
原题来自:NOIP 2006
在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有 颗能量珠。能量珠是一颗有头标记和尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记必定等于后一颗珠子的头标记。因为只有这样,通过吸盘——Mars 人吸收能量的器官的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可被吸盘吸收的能量。如果一颗能量珠头标记为 ,尾标记为 ,后一颗能量珠头标记为 ,尾标记为 ,则聚合后释放出 Mars单位的能量,新珠子头标记为 ,尾标记为 。
当需要时,Mars 人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不一样的。请设计一个聚合顺序使得一串珠子聚合后释放出的总能量最大。
例如,设 ,四颗珠子头标记与尾标记分别为 。我们用记号 表示两颗珠子的聚合操作, 表示 两颗珠子聚合后释放出的能量,则两颗珠子聚合后所释放的能量为,这一串项链可以得到最优值的一个聚合顺序所释放出的总能量为 $10\times 2\times 3+10\times 3\times 5+10\times 5\times 10=710$
现在给你一串项链,项链上有 颗珠子,相邻两颗珠子可以合并成一个,合并同时会放出一定的能量,不同珠子合并放出能量不相同,请问按怎样的次序合并才能使得释放的能量最多?
输入格式
第一行一个正整数
第二行 个不超过 的正整数,第 个数为第 颗珠子的头标记,当 时第 颗珠子的尾标记等于第 颗珠子的头标记,当 时第 颗珠子的尾标记等于第 颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放在桌面上,不要出现交叉,随机指定一颗珠子为第一颗珠子,按顺时针确定其它珠子的顺序。
输出格式
输出只有一行,一个不超过 的正整数,表示最优聚合顺序所释放的能量。
样例
4
2 3 5 10
710
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n, a[N], f[N][N];
int main(){
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> a[i], a[i + n] = a[i];
for(int len = 3; len <= n + 1; ++ len){
for(int i = 1, j; j = i + len - 1, j <= 2 * n; ++ i){
for(int k = i + 1; k < j; ++ k){
f[i][j] = max(f[i][j], f[i][k] + f[k][j] + a[i] * a[k] * a[j]);
}
}
}
int ans = 0;
for(int i = 1; i <= n; ++ i){
ans = max(ans, f[i][i + n]);
}
cout << ans;
return 0;
}
数据范围与提示
对于 的数据,。