问题描述
在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m*r*n(Mars单位),新产生的珠子的头标记为m,尾标记为n。
需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:
(4⊕1)=10*2*3=60。
这一串项链可以得到最优值的一个聚合顺序所释放的总能量为
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。
需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:
(4⊕1)=10*2*3=60。
这一串项链可以得到最优值的一个聚合顺序所释放的总能量为
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。
输入格式
输入的第一行是一个正整数N(4≤N≤100),表示项链上珠子的个数。第二行是N个用空格隔开的正整数,所有的数均不超过1000。第i个数为第i颗珠子的头标记(1≤i≤N),当i<N时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
输出格式
输出只有一行,是一个正整数E(E≤2.1*10
9),为一个最优聚合顺序所释放的总能量。
样例输入
4
2 3 5 10
2 3 5 10
样例输出
710
1.C++
/**************Powered by Graphene Richards**************/
extern"C++"{
#define FLOAT_PRECISION 2
#ifdef _MSC_VER
#define _SECURE_SCL 0
#pragma comment(linker,"/STACK:102400000,102400000")
#else
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
#endif
#if defined(_MSC_VER)||__cplusplus>199711L
#define IT(x) auto
#define DIT(x) auto
#else
#define IT(x) __typeof((x).begin())
#define DIT(x) __typeof((x).rbegin())
#endif
# inc\
lude<cmath>
# inc\
lude<cstdio>
# inc\
lude<cstdlib>
# inc\
lude<cstring>
# inc\
lude<algorithm>
# inc\
lude<bitset>
# inc\
lude<complex>
# inc\
lude<vector>
# inc\
lude<iomanip>
# inc\
lude<iostream>
# inc\
lude<list>
# inc\
lude<map>
# inc\
lude<queue>
# inc\
lude<set>
# inc\
lude<stack>
# inc\
lude<string>
#define FAST_RW ios_base::sync_with_stdio(0),cin.tie(0);
#define FS(i,a) for(ll i=0;a[i];i++)
#define FE(it,x) for(IT(x) it=(x).begin(),_en=(x).end();it!=_en;it++)
#define EF(it,x) for(DIT(x) it=(x).rbegin(),_en=(x).rend();it!=_en;it++)
#define FR(i,en) for(ll i=0,_en=(en);i<_en;i++)
#define FOR(i,en) for(ll i=1,_en=(en);i<=_en;i++)
#define RF(i,en) for(ll i=(en)-1;i>=0;i--)
#define ROF(i,en) for(ll i=(en);i>0;i--)
#define FFR(i,x,y) for(ll i=(x),_en=(y);i<=_en;i++)
#define RFF(i,x,y) for(ll i=(x),_en=(y);i>=_en;i--)
#define pc putchar
#define pb push_back
#define ppb pop_back
#define pq priority_queue
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
#define sqr(x) ((x)*(x))
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define clr(x) memset((x),0,sizeof(x))
#define ms(x,v) memset((x),(v),sizeof(x))
#define mc(x,y) memcpy((x),(y),sizeof(y))
#define NL puts("");
#define LB lower_bound
#define UB upper_bound
#define rand() ((rand()<<16)^(rand()<<15)^(rand()))
#ifdef _WIN32
#define _i64_ "%I\
64d"
#define _u64_ "%I\
64u"
#else
#define _i64_ "%l\
ld"
#define _u64_ "%l\
lu"
#endif
typedef unsigned ui;
typedef long long ll;
typedef unsigned long long ull;
typedef long double lf;
using namespace std;
ull gcd(ull a,ull b){if(!b)return a;while(b^=a^=b^=a%=b);return a;}
extern const ll MOD;
ll ksm(ll a,ll b){
ll res=1;a%=MOD;
for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}
return res;
}
#ifdef wmx16835
#include"wmx16835.h"
#else
#define LOG
#define TEL
#define test(...) 0
#define TEST(...) 0
#define TRY(...)
#define SF(...)
#define SC
#define PF
#define PC
#define PP
#define SHOW_TIME
#define BR
#endif
int main(){SHOW_TIME int __MAIN();__MAIN();}
#define main __MAIN
#define y0 NKwKGuBI
#define y1 KFJssmlK
#define yn XypGISMR
#define j1 kQDCYYWX
#define tm BdKIQNcs
#define lr UsCPcJvt
template<class T1,class T2,class T3>bool In(T1 x,T2 y,T3 z){return x<=y&&x>=z||x<=z&&x>=y;}
template<class T1,class T2>T1 max(const T1&a,const T2&b){return a<b?b:a;}
template<class T1,class T2,class T3>T1 max3(const T1&a,const T2&b,const T3&c){return a<b?(b<c?c:b):(a<c?c:a);}
template<class T1,class T2>T1 min(const T1&a,const T2&b){return a<b?a:b;}
template<class T1,class T2,class T3>T1 min3(const T1&a,const T2&b,const T3&c){return a<b?(a<c?a:c):(b<c?b:c);}
bool S(char*a){return scanf("%s",a)==1;}
bool S(int&a){return scanf("%d",&a)==1;}
bool S(bool&a){return scanf("%d",&a)==1;}
bool S(ui&a){return scanf("%u",&a)==1;}
bool S(float&a){return scanf("%f",&a)==1;}
bool S(double&a){return scanf("%lf",&a)==1;}
bool S(ll&a){return scanf(_i64_,&a)==1;}
bool S(ull&a){return scanf(_u64_,&a)==1;}
bool S(lf&a){double b;if(scanf("%lf",&b)==-1)return 0;a=b;return 1;}
bool S(char&a){char b[2];if(scanf("%1s",b)==-1)return 0;a=*b;return 1;}
bool SL(char*a){a[0]=0;while(gets(a)&&!a[0]);return a[0];}
template<class T1,class T2>bool S(pair<T1,T2>&a){S(a.fi),S(a.se);}
template<class T>bool S(T&a){a.in();}
void _P(const int&x){printf("%d",x);}
void _P(const bool&x){printf("%d",x);}
void _P(const ui&x){printf("%u",x);}
void _P(const char&x){printf("%c",x);}
void _P(const char*x){printf("%s",x);}
void _P(const string&x){printf("%s",x.c_str());}
void _P(const ll&x){printf(_i64_,x);}
void _P(const ull&x){printf(_u64_,x);}
void _P(const float&x){printf("%.*f",FLOAT_PRECISION,x);}
void _P(const double&x){printf("%.*f",FLOAT_PRECISION,x);}
void _P(const lf&x){printf("%.*f",FLOAT_PRECISION,(double)x);}
template<class T1,class T2>void _P(const pair<T1,T2>&x){_P(x.fi);pc(' ');_P(x.se);}
template<class T>void _P(const T&a){a.out();}
template<class T1,class T2>bool S(T1&a,T2&b){return S(a)+S(b)==2;}
template<class T1,class T2,class T3>bool S(T1&a,T2&b,T3&c){return S(a)+S(b)+S(c)==3;}
template<class T1,class T2,class T3,class T4>bool S(T1&a,T2&b,T3&c,T4&d){return S(a)+S(b)+S(c)+S(d)==4;}
template<class T1,class T2,class T3,class T4,class T5>bool S(T1&a,T2&b,T3&c,T4&d,T5&e){return S(a)+S(b)+S(c)+S(d)+S(e)==5;}
template<class T1>void P(const T1&a){_P(a);pc(' ');}
template<class T1,class T2>void P(const T1&a,const T2&b){_P(a);pc(' ');_P(b);pc(' ');}
template<class T1>void PN(const T1&a){_P(a);NL}
template<class T1,class T2>void PN(const T1&a,const T2&b){_P(a);pc(' ');_P(b);NL}
template<class T1,class T2,class T3>void PN(const T1&a,const T2&b,const T3&c){_P(a);pc(' ');_P(b);pc(' ');_P(c);NL}
template<class T1,class T2,class T3,class T4>void PN(const T1&a,const T2&b,const T3&c,const T4&d){_P(a);pc(' ');_P(b);pc(' ');_P(c);pc(' ');_P(d);NL}
template<class T1,class T2,class T3,class T4,class T5>void PN(const T1&a,const T2&b,const T3&c,const T4&d,const T5&e){_P(a);pc(' ');_P(b);pc(' ');_P(c);pc(' ');_P(d);pc(' ');_P(e);NL}
void PS(int a){printf("%*s",a,"");}
template<class T>void SA(T*a,int n){FR(i,n)S(a[i]);}
template<class T>void PA(T*a,int n){FR(i,n){if(i)pc(' ');_P(a[i]);}NL}
template<class T>void PA(const T&x){FE(it,x){if(it!=x.begin())pc(' ');_P(*it);}NL}
int kase;
const double pi=4*atan(1.);
const double ep=1e-9;
const int INF=0x3f3f3f3f;
const ll INFL=0x3f3f3f3f3f3f3f3fll;
const ll MOD=1000000007;
}
int d[105][105];
int a[105];
int main() {
int n;
S(n);
FR(i, n) {
S(a[i]);
}
FOR(l, n - 1) {
FR(i, n) {
int j = (i + l) % n;
for (int k = i; k != j; k = (k + 1) % n) {
d[i][j] = max(d[i][j], d[i][k] + d[(k + 1) % n][j] + a[(k + 1) % n] * a[i] * a[(j + 1) % n]);
}
}
}
int res = 0;
FR(i, n) res = max(res, d[i][(i + n - 1) % n]);
PN(res);
}
/*********Risoft corporation all rights reserved*********/
/**************Template V2.33 build 20151012*************/
2.C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 220
int dp[SIZE][SIZE],a[SIZE];
int ans;
int max(int a,int b){
return a>b?a:b;
}
int main()
{
int N,i,j,k;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&a[i]);
a[N+i]=a[i];
}
memset(dp,0,sizeof(dp));
for(j=1;j< N;j++)
{
for(i=1;i+j< 2*N;i++)
{
int tmp=0;
for(k=0;k< j;k++)
{
tmp=max(tmp,dp[i][i+k]+dp[i+k+1][i+j]+a[i]*a[i+k+1]*a[i+j+1]);
}
dp[i][i+j]=tmp;
}
}
ans=0;
for(i=1;i<=N;i++)
{
ans=max(ans,dp[i][i+N-1]);
}
printf("%d\n",ans);
system("pause");
return 0;
}
3.JAVA
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static void print(int[][] map,int n,int m){
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(map[i][j]+" ");
}System.out.println();
}
}
static int max(int a,int b){return a>b?a:b;}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(bf.readLine());
String[] a1=bf.readLine().split(" ");
int[] s=new int[n];
for (int i = 0; i < n; i++)
s[i]=Integer.parseInt(a1[i]);
int h=1;
int[][] dp=new int[n][n];
for (int r = 0; r <n; r++) {
for (int i = 0; i <n ; i++) {
int j=r+i+1;
if(i%n==j%n)continue;
for (int k = i; k <j; k++) {
int t=dp[i%n][k%n]+dp[(k+1)%n][j%n]+s[i%n]*s[(k+1)%n]*s[(j+1)%n];
dp[i%n][j%n]=max(t, dp[i%n][j%n]);
}
}
}
int max=dp[0][n-1];
int i=1,j=0;
while (i<n&&j<n) {
max=max(dp[i++][j++], max);
}
//System.out.println(dp[1][n]);
//print(dp, n, n);
System.out.println(max);
//print(dp, n+1, n+1);
}
}