描述

在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为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),当1≤i<N时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于第1颗珠子的头标记。

至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。

输出格式

输出文件只有一行,是一个正整数E(E≤2.1*109),为一个最优聚合顺序所释放的总能量。

样例1

样例输入1

4
2 3 5 10

样例输出1

710

限制

1s

来源

NOIP2006第一题

(转自Vijos1312,题目传送门[codevs]&[vijos])


  这道题和加分二叉树有点像,所以立刻想到区间dp。它们俩的差别大概就在一个是树上,还有一个是在环上。处理环就像骑士那样处理,破环成链,特殊处理两端。于是用f[aflag][i][j]来进行dp.

  (PS,下文的区间指的是项链上的一段,[i, j]表示第i个能量珠到第j个能量珠这一段)

  其中aflag为0时表示是在链上,[i, j]区间的能量珠合并出来的最大值。当aflag为0时表示过剖开点,从j到i(区间[j, n][1, i])。

  在链上的比较简单,很容易可以想出方程 f[0][i][j] = max{f[0][i][k] + f[0][k + 1][j] + a[i] * a[k + 1] + a[(j + 1) % n]}(a表示读入的n个数,下标从0开始)

  过剖开点就有三种情况

  1. k在左端,f[1][i][j] = max{f[0][k][i] + f[1][k - 1][j] + a[(i + 1) % n] * a[k] * a[j]}

  2. k在右端,f[1][i][j] = max{f[0][j][k] + f[1][i][k + 1] + a[j] * a[k + 1] * a[(i + 1) % n]}

  3. 刚好是两个在链上的区间(区间[j, n][1, i])合并,smax(f[1][i][j], f[0][0][i] + f[0][j][n - 1] + a[j] * a[0] * a[i + 1])

最后在f[0][0][n - 1]f[1][i][i + 1]中找找最大值就好了。

Code

 /**
* codevs & vijos.org
* Problem#1154 & 1312
* Accepted & Accepted
* Time:13ms & 30ms
* Memory:364k & 536k
*/
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
typedef bool boolean;
#define smin(a, b) (a) = min((a), (b))
#define smax(a, b) (a) = max((a), (b))
template<typename T>
inline void readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-');
if(x == '-'){
aFlag = -;
x = getchar();
}
for(u = x - ''; isdigit((x = getchar())); u = u * + x - '');
ungetc(x, stdin);
u *= aFlag;
} template<typename T>class Matrix{
public:
T *p;
int lines;
int rows;
Matrix():p(NULL){ }
Matrix(int rows, int lines):lines(lines), rows(rows){
p = new T[(lines * rows)];
}
T* operator [](int pos){
return (p + pos * lines);
}
};
#define matset(m, i, s) memset((m).p, (i), (s) * (m).lines * (m).rows) #define idx(i) a[(i + n) % n] int n;
int *a;
Matrix<int> f[]; inline void init(){
readInteger(n);
f[] = Matrix<int>(n, n);
f[] = Matrix<int>(n, n);
a = new int[(const int)(n)];
for(int i = ; i < n; i++)
readInteger(a[i]);
} inline void solve(){
matset(f[], 0xf0, sizeof(int));
matset(f[], 0xf0, sizeof(int));
for(int i = ; i < n - ; i++){
f[][i][i + ] = a[i] * a[i + ] * idx(i + );
}
for(int i = ; i < n; i++) f[][i][i] = ;
f[][][n - ] = a[n - ] * a[] * a[];
for(int s = ; s < n; s++){
for(int i = ; i + s < n; i++){
int j = i + s;
for(int k = i; k < j; k++){
smax(f[][i][j], f[][i][k] + f[][k + ][j] + a[i] * a[k + ] * idx(j + ));
}
}
for(int i = ; i - s < ; i++){
int j = (i - s + n) % n;
for(int k = i; k > ; k--){
smax(f[][i][j], f[][k][i] + f[][k - ][j] + idx(i + ) * a[k] * a[j]);
}
for(int k = j; k < n - ; k++){
smax(f[][i][j], f[][j][k] + f[][i][k + ] + a[j] * a[k + ] * idx(i + ));
}
smax(f[][i][j], f[][][i] + f[][j][n - ] + a[j] * a[] * a[i + ]);
}
}
int result = f[][][n - ];
for(int i = ; i < n - ; i++){
smax(result, f[][i][i + ]);
}
cout << result;
} ///Main Funtion
int main(int argc, char* argv[]){
init();
solve();
return ;
}

[题解]vijos & codevs 能量项链的更多相关文章

  1. vijos & codevs 能量项链 - 动态规划

    描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于 ...

  2. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  3. codevs——1154 能量项链(区间DP)

    2006年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解    题目描述 Description 在Mars星球上,每个Mars人 ...

  4. 1154 能量项链 2006年NOIP全国联赛提高组 codevs

    1154 能量项链  2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...

  5. codevs 1154 能量项链

    传送门 1154 能量项链 2006年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 在Mars星 ...

  6. 能量项链(codevs 1154)

    题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...

  7. 洛谷 P1063 能量项链 题解

    P1063 能量项链 题目描述 在\(Mars\)星球上,每个\(Mars\)人都随身佩带着一串能量项链.在项链上有\(N\)颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并 ...

  8. [codevs1154][COJ0177][NOIP2006]能量项链

    [codevs1154][COJ0177][NOIP2006]能量项链 试题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这 ...

  9. tyvj 1056 能量项链 区间dp (很神)

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

随机推荐

  1. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  2. opencv 震撼你的视觉-------基础篇

    opencv 最近在做一个钓鱼网站的项目中用到了一个叫opencv的玩意儿,以前没接触过.感觉挺新鲜的,而且项目中要用,所以就问了一下度娘(是想Google一下的,显得高大上and专业一点,但是英语水 ...

  3. assert断言基础用法

    Python的assert是用来检查一个条件,如果它为真,就不做任何事.如果它为假,则会抛出AssertError并且包含错误信息

  4. mac boot2docker certs not valid with 1.7

    摘自:https://github.com/boot2docker/boot2docker/issues/824 An error occurred trying to connect: Get ht ...

  5. Tomcat启动时自动加载Servlet

    1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet ...

  6. python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)

    在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...

  7. nginx转发post消息成301了

    刚才开始是:第一次遇到这个问题是因为不支持sslv3 后来测试的时候,是因为没注意https的导致http 301跳转https post请求nginx转发成301了,到时post数据丢失

  8. php工作笔记8-并发和数据类型

    1.mysql在进行数据的修改时,并发情况下: $RoundsRows=$modelRounds->where("id=$roundsID and (sendMoney + $amou ...

  9. SpringMVC无法获取请求中的参数的问题的调查与解决(2)

    由于Request的getInputSteam()一旦获取一次后,就再也无法获取了 在实际项目中导致下面的问题: 1,多个拦截器,Filter都需要从InputStream中拿数据的情况无法处理: 2 ...

  10. VS SETUP项目更新的问题

    用VS建立了一个SetUp类型的项目,build以后将生成的setup文件在机器上安装,然后再rebuild,再安装新生成的setup文件,会出现如下的提示信息: Another version of ...