[原文地址](https://xiaohuang888.github.io/2019/02/25/『题解』洛谷P1063 能量项链)

Problem Portal

Portal1:Luogu

Portal2:LibreOJ

Portal3:Vijos

Description

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

这一串项链可以得到最优值的一个聚合顺序所释放的总能量为:

\(((4\)⊕\(1)\)⊕\(2)\)⊕\(3)=10 \times 2 \times 3+10 \times 3 \times 5+10 \times 5 \times 10=710\)。

Input

第一行是一个正整数\(n(4 \leq n \leq 100)\),表示项链上珠子的个数。第二行是\(n\)个用空格隔开的正整数,所有的数均不超过\(1000\)。第\(i\)个数为第\(i\)颗珠子的头标记\((1 \leq i \leq n)\),当\(i<n\)时,第\(i\)颗珠子的尾标记应该等于第\(i+1\)颗珠子的头标记。第\(n\)颗珠子的尾标记应该等于第\(1\)颗珠子的头标记。

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

Output

一个正整数\(E(E \leq 2.1×10^{9})\),为一个最优聚合顺序所释放的总能量。

Sample Input

  1. 4
  2. 2 3 5 10

Sample Output

  1. 710

Solution

\(\text{dp[i][j]}​\)表示以\(\text{a[i]}​\)开头\(\text{a[j]}​\)结尾的能量的最大值,可以推出动态转移方程:\(dp[i][j]=\max(f[i][j], dp[i][k]+dp[k][j]+a[i] \times a[k] \times a[j])\)。

Source

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. const int INF=0x7f7f7f7f, MAXN=205;
  8. int n, a[MAXN], dp[MAXN][MAXN];
  9. int main() {
  10. scanf("%d",&n);
  11. for (int i=1; i<=n; i++) {
  12. scanf("%d",&a[i]);
  13. a[n+i]=a[i];//复制成环
  14. }
  15. memset(dp, 0, sizeof(dp));
  16. for (int len=2; len<=n; len++) {
  17. for (int i=1; i+len-1<=(n<<1); i++) {
  18. int j=i+len-1;
  19. for (int k=i; k<j; k++)//枚举k
  20. dp[i][j]=max(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);//动态转移方程
  21. }
  22. }
  23. int Max=-INF;
  24. for (int i=1; i<=n; i++)
  25. if (dp[i][i+n-1]>Max) Max=dp[i][i+n-1];//寻找最大的能量值
  26. printf("%d\n",Max);
  27. return 0;
  28. }

『题解』洛谷P1063 能量项链的更多相关文章

  1. 洛谷P1063 能量项链(区间DP)(环形DP)

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

  2. 洛谷 P1063 能量项链 题解

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

  3. 洛谷P1063 能量项链 [2006NOIP提高组]

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

  4. 洛谷——P1063 能量项链

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

  5. 洛谷 P1063 能量项链

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

  6. [NOIP2006] 提高组 洛谷P1063 能量项链

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

  7. 洛谷P1063.能量项链

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

  8. 洛谷P1063能量项链题解

    $题目$ 不得不说,最近我特别爱刷这种区间DP题,因为这个跟其他的DP有些不一样的地方,主要是有一定的套路,就是通过小区间的状态更新大区间,从而得到原题给定区间的最优解. $但是$ 这个题应该跟$石子 ...

  9. 洛谷P1063能量项链(区间dp)

    题目描述: 给定一串序列x[],其中的每一个Xi看作看作一颗珠子,每个珠子包含两个参数,head和tail,前一颗的tail值是后一个的head值,珠子呈现环形(是一条项链),所以最后一颗的tail是 ...

随机推荐

  1. 什么是Cookie?——每日一题20190623

    什么是Cookie? Cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个Cookie.客户端会把Cookie存起来, ...

  2. 52个有效方法(1) - 了解Objective-C语言的起源

    Objective-C语言使用的是"消息结构"而非"函数调用" "消息结构"和"函数调用"之间的区别 "消息结 ...

  3. 02-13 Softmax回归

    目录 Softmax回归 一.Softmax回归详解 1.1 让步比 1.2 不同类之间的概率分布 1.3 目标函数 1.4 目标函数最大化 二.Softmax回归优缺点 2.1 优点 2.2 缺点 ...

  4. python编程基础之七

    运算关系:也就是常说比较运算,返回值只有True, False ==  判断是否相等 != 判断是否不相等 > ,< ,>= , <=    判断是否大于,小于,大于等于,小于 ...

  5. UVA - 12099 The Bookcase

    No wonder the old bookcase caved under the massive piles of books Tom had stacked on it. He had bett ...

  6. ES三节点重启后报错no known master node

    问题 一直在研究ES的监控怎么做,想偷点懒,不去通过API获取然后计算,就想找个现成的插件或者监控软件,只要装个agent就可以,然后就找到了x-pack,插件装好了之后,需要重启ES集群,线上的ES ...

  7. CS231n:Python Numpy教程

    Python 基本数据类型 容器 列表 字典 集合 元组 函数 类 Numpy 数组 访问数组 数据类型 数组计算 广播 SciPy 图像操作 MATLAB文件 点之间的距离 Matplotlib 绘 ...

  8. Did You AK Today? (今天你AK了吗?)

    考虑到本文读者年龄原因,本文改为使用简体中文撰写. 题目描述 今有正整数 n,kn,kn,k,求 1−n1-n1−n 共 nnn 个数的全排列,按字典序的第 kkk 个. 数据满足 1≤n≤105,1 ...

  9. css布局两端固定中间自适应

    第一种:采用浮动 1.1首先来看一下网上一个哥们给的代码 <body> <div class="left">左</div> <div cl ...

  10. win32API多线程编程

    win32线程API 在Windows平台下可以通过Windows的线程库来实现多线程编程. 对于多线程程序可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析调试工具 ...