问题描述
  在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*109),为一个最优聚合顺序所释放的总能量。
样例输入
4
2 3 5 10
样例输出
710
分析:状态转移方程:dp[i][j] = max(dp[i][j], dp[i][k] + dp[(k + 1) % n][j] + a[i] * a[(k + 1) % n] * a[(j + 1) % n]);
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#define pr(x) cout << #x << " : " << x << "   "
#define prln(x) cout << #x << " : " << x << endl
#define Size(x) (int)((x).size())
#define fi(x) ((x).first)
#define se(x) ((x).second)
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const double pi = acos(-1.0);
using namespace std;
inline void debug(char ch){for(int __ii = 0; __ii < 20; ++__ii)putchar(ch);printf("\n");}
const double eps = 1e-8;
inline int dcmp(double a, double b) {if(fabs(a - b) < eps)  return 0;return a < b ? -1 : 1;
}
#define fin freopen("in.txt", "r", stdin)
#define fout freopen("out.txt", "w", stdout)
const int MAXN = 100 + 10;
const int MAXT = 100000 + 5;
LL dp[MAXN][MAXN];
LL a[MAXN];
int main() {int n;scanf("%d", &n);for(int i = 0; i < n; ++i){scanf("%lld", &a[i]);}for(int l = 1; l < n; ++l){for(int i = 0; i < n; ++i){int j = (i + l) % n;for(int k = i; k != j; k = (k + 1) % n){dp[i][j] = max(dp[i][j], dp[i][k] + dp[(k + 1) % n][j] + a[i] * a[(k + 1) % n] * a[(j + 1) % n]);}}}LL ans = 0;for(int i = 0; i < n; ++i){int j = (i + n - 1) % n;ans = max(ans, dp[i][j]);}printf("%lld\n", ans);return 0;
}

  

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/8900854.html

蓝桥杯 能量项链 (区间dp)相关推荐

  1. 洛谷 P1063 能量项链 区间dp

    洛谷 P1063 题意:在一串项链中,是环状的,第 i 颗珠子有两个能量a[i]和a[i+1],第i+1颗珠子有两个能量a[i+1]和a[i+2],可以合并两个珠子,得到a[i]*a[i+1]*a[i ...

  2. P1063 [NOIP2006 提高组] 能量项链 区间dp

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

  3. 能量项链--区间dp典例

    题目 思路 1.断环成链 2.区间大小枚举 3.区间起点枚举 4.区间的划分枚举 分析 1.可以采用处理环形问题的通用技巧,即复制一份接到后面.这里虽然输入是N个数,但实际上我们要求的是长N + 1的 ...

  4. [蓝桥杯] 连号区间数

    [蓝桥杯] 连号区间数 峰值内存消耗 < 64M CPU消耗  < 5000ms [题目描述 - Problem Description] 小明这些天一直在思考这样一个奇怪而有趣的问题: ...

  5. 蓝桥杯 - 连号区间数(暴力)

    小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得 ...

  6. 蓝桥杯 分割项链 Java

    问题描述 两个强盗刚刚抢到一条十分珍贵的珍珠项链,正在考虑如何分赃.由于他们不想破坏项链的美观,所以只想把项链分成两条连续的珍珠链.然而亲兄弟明算账,他们不希望因为分赃不均导致不必要的麻烦,所以他们希 ...

  7. 回路计数蓝桥杯(状态压缩dp)

    第一次碰到状态压缩求方法数,记录一下 回路计数 题目描述 蓝桥学院由 2121​​​ 栋教学楼组成,教学楼编号 11​​ 到 2121​​.对于两栋教学楼 aa​​ 和 bb​,当 aa​ 和 bb​ ...

  8. 蓝桥杯 k倍区间 前缀和

    参考代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int array[100005], t[ ...

  9. java 蓝桥杯 算法训练 区间k大数查询(题解)

    试题 算法训练 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示 ...

最新文章

  1. 关于项目数据库设计--投票系统
  2. 基于BootstarbTable实现加载更多的方式
  3. 38. Leetcode 101. 对称二叉树 (二叉树-二叉树性质)
  4. 在angular中一个页面滚动后,打开新页面不在最顶部的解决办法
  5. Go语言基础:method
  6. fusionsphere的核心组件_FusionSphere架构详解
  7. idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍
  8. openjdk7的ImageIO.read()导致jvm异常crash
  9. 【C++笔记】变量和基本类型
  10. 在Postgresql中添加新角色(Role)
  11. python3发送邮件_Python3发送电子邮件
  12. MKS_SGEN_L V1.0 marlin 固件编译
  13. 1920*1080分辨率图片怎么调?图片尺寸分辨率如何修改
  14. 理论+股市数据实战,总结了五种常用聚类分析算法
  15. 微信中无法直接下载棋牌游戏类app的解决办法
  16. 文件存储管理 android,Android数据持久化之文件存储
  17. jmeter http并发测试设置教程(设置线程组,设置http,csv参数化,查看结果集)
  18. 使用Java8中的Optional类来消除代码中的null检查
  19. 视频号跳转商品页面的教程
  20. 引导滤波(guided filter)理解和代码实现

热门文章

  1. 【收藏】k8s: pod has unbound PersistentVolumeClaims问题解决
  2. Hadoop Yarn容量调度器特点和分配算法介绍
  3. spark wordcount完整工程代码(含pom.xml)
  4. Linux使用ffmpeg合并视频
  5. Hadoop hdfs 从指定偏移量读取文件数据代码示例
  6. Spring MVC HttpMessageConverter对象
  7. Mybatis核心配置文件SqlMapConfig.xml独立使用配置内容
  8. Java面向对象之构造方法
  9. Spring实现web开发的环境搭建
  10. eclipse出现updating error reports database一直运行解决方案