ADV-163 能量项链

问题描述
  在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。
输入格式
  输入的第一行是一个正整数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
样例输出

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);
	
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值