2021.06.03合并石子+能量项链

题目描述

在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出一个算法,计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。

输入格式

数据的第 1 行是正整数 N,表示有 N 堆石子。

第 2 行有 N 个整数,第 i 个整数 a i a_i ai​

表示第 i 堆石子的个数。

输出格式

输出共 2 行,第 1 行为最小得分,第 2 行为最大得分。

样例输入

4
4 5 9 4

样例输出

43
54

数据规模和约定

1≤N≤100, 0 ≤ a i ≤ 20 0\leq a_i\leq 20 0≤ai​≤20

思路

  1. 先思考如何确定子状态:
    如果两堆(A,B)组成C,导致C的得分最大,那么是否A,B也是最大得分状态?
    证:如果上述命题不成立,那么说明A,B得分还能更大,就可以得到更大的C得分,与前提矛盾。
  2. 所以,对于区间[i,j]只需要求出它所有切分情况(分成两堆),并求出切分的子堆最大得分,就可以推出dp[i][j]。
  3. 定义状态:
    dp[i][j]:第i堆到第j堆的最大得分。
  4. 状态转移:
    dp[i][j] = max/min{ dp[i][k] + dp[k+1][j] + val(i,j) }
    其中val(i,j)为第i堆到第j堆石子的总个数。此外,当更新dp[i][j]时,并不能确定dp[i][k]是否已经更新成最优,所以在循环时,设定当前石头的组数,当前组数等于3时,那么小于3组的石头的情况已经全部更新为最优。具体些,当求dp[1][5]时,dp[1][2],dp[2][4]都已经更新成最优了,可以有效推出dp[1][5]。
  5. 另外, 由于石头成环状放置,还需要考虑环的情况。

代码

 class Solution{ int MAXLEN = 500;int[][] dp1 = new int[MAXLEN][MAXLEN]; int[][] dp2 = new int[MAXLEN][MAXLEN];int[] arr = new int[MAXLEN];int[] s = new int[MAXLEN];int n;void test() {Scanner cin = new Scanner(System.in);n = cin.nextInt();for(int i = 1; i <= n; i++) {arr[i] = cin.nextInt();arr[i+n] = arr[i];s[i] = s[i-1] + arr[i];}for(int i = n+1; i < 2*n; i++) s[i] = s[i-1]+arr[i];for(int len = 1; len < n; len++) {for(int i = 1; i < 2*n; i++) { //遍历起点int j = i+len; //找到区间右边界if(j >= 2*n) break; //如果越界dp2[i][j] = 999999999;for(int k = i; k < j; k++) {dp1[i][j] = Math.max(dp1[i][j], dp1[i][k]+dp1[k+1][j]+d(i,j));dp2[i][j] = Math.min(dp2[i][j], dp2[i][k]+dp2[k+1][j]+d(i,j));}}}int max = 0, min = 999999999;for(int i = 1; i <= n; i++) {max = Math.max(max, dp1[i][i+n-1]);min = Math.min(min, dp2[i][i+n-1]);}System.out.println(min);System.out.println(max);}int d(int i, int j) {return s[j]-s[i-1];}}

能量项链

题目描述

在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有 N 颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是 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)。我们用记号 ⊕ \oplus ⊕ 表示两颗珠子的聚合操作, ( j ⊕ k ) (j \oplus k) (j⊕k) 表示第 j,k 两颗珠子聚合后所释放的能量。则第 4 、 1 两颗珠子聚合后释放的能量为:

( 4 ⊕ 1 ) = 10 × 2 × 3 = 60 (4 \oplus 1)=10 \times 2 \times 3=60 (4⊕1)=10×2×3=60

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

( ( 4 ⊕ 1 ) ⊕ 2 ) ⊕ 3 ) = 10 × 2 × 3 + 10 × 3 × 5 + 10 × 5 × 10 = 710 ((4 \oplus 1) \oplus 2) \oplus 3)=10 \times 2 \times 3+10 \times 3 \times 5+10 \times 5 \times 10=710 ((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 × 1 0 9 E\le 2.1 \times 10^9 E≤2.1×109),为一个最优聚合顺序所释放的总能量。

样例输入

4
2 3 5 10

样例输出

710

思路 同上。

  1. 区间dp问题都是和区间划分有关。即求出一个区间的最大分数,这个分数和区间的一个划分有关。即:

区 间 划 分 的 分 数 = > 区 间 的 最 大 得 分 区间划分的分数 => 区间的最大得分 区间划分的分数=>区间的最大得分

  1. 分析同上

代码

    class Solution{ int MAXLEN = 500;//dp[i][j]: 第i个到第j个聚合的最大能量,只和中间变量int[][] dp = new int[MAXLEN][MAXLEN]; int[] arr = new int[MAXLEN]; //表示第i个珠子的头,即第i-1个珠子的尾int[] s = new int[MAXLEN];int n;void test() {Scanner cin = new Scanner(System.in);n = cin.nextInt();s[0] = 1;for(int i = 1; i <= n; i++) {arr[i] = cin.nextInt();arr[i+n] = arr[i];s[i] = s[i-1] * arr[i];}for(int i = n+1; i <= 2*n; i++) s[i] = s[i-1]+arr[i]; for(int len = 1; len < n; len++) {//区间长度for(int i = 1; i < 2*n; i++) {//第i个珠子int j = i+len; //找到区间右边界if(j >= 2*n) break; //如果越界for(int k = i; k < j; k++) {dp[i][j] = Math.max(dp[i][j], dp[i][k]+dp[k+1][j]+arr[i]*arr[k+1]*arr[j+1]);}}}int max = 0;for(int i = 1; i <= n; i++) {max = Math.max(max, dp[i][i+n-1]);}System.out.println(max);}}

2021.06.03合并石子+能量项链相关推荐

  1. 2021.06.03邮票面值设计

    2021.06.03邮票面值设计 题目描述 给定一个信封,最多只允许粘贴 N 张邮票,计算在给定 K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值 MAX ...

  2. 【codevs1048】【codevs115406TG】石子归并、能量项链,序列dp的典型题目

    1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并 ...

  3. 【每日DP】day12、P1063 能量项链(区间DP又一模板,震惊,只需要4行代码?)难度⭐⭐⭐

    P1063 能量项链 本题(NOIP2006)和石子合并(NOI1999)几乎一模一样 垃圾NOIP抄袭NOI,手动狗头 但是还是有细微的区别的,首先你得先能看懂题,石子合并是N堆石子,是i−ki-k ...

  4. P1063 能量项链

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

  5. 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

    矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...

  6. 能量项链(NOIP-2006 提高组)

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

  7. 【区间动规】【记忆化搜索】能量项链

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

  8. 320. 能量项链 (区间dp)

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

  9. 能量项链(区间DP)

    传送门:能量项链 思路:与环形石子合并问题相似,可以把环形的问题转化成线形的问题,所以考虑线形的怎么做 状态表示:f[i][j]表示第i个数到第j个数所能产生的能量的最大值 状态转移方程:f[i][j ...

最新文章

  1. 掌握这10个Python小技巧,让你敲代码速度快5倍不止
  2. linux七个运行级如何设置,RHEL7 运行级别简介及切换操作
  3. 第二次作业+105032014101
  4. 草地排水-网络流dinic
  5. angularJS添加form验证:自定义验证
  6. 学习:大文件统计与排序
  7. atitit.html编辑器的设计要点与框架选型 attilax总结
  8. Excel 导入 SqlServer 导入部分文本为空解决方案
  9. amd显卡驱动目录linux,面向 Radeon、Radeon Pro、FirePro、APU、CPU、锐龙、台式机、笔记本的 AMD 驱动程序和支持...
  10. uview实现点击预览图片效果
  11. 412 Precondition Failed
  12. 如何看懂常用原理图符号、如何阅读原理图
  13. Cortana搜索框怎么在任务栏显示?
  14. 网络信息安全之信息系统安全保障
  15. 怎么批量转换图片格式?
  16. 认知升级|系列1|富人思维
  17. ndis拨号软件 linux,嵌入式linux系统下NDIS拨号
  18. Python:信号量semaphore
  19. hdu 5454 Excited Database(线段树)
  20. LSTM案例——动态和可解释的ICU死亡风险预测

热门文章

  1. 为硬件保留内存 问题的解决方法
  2. 私有云和公有云的区别
  3. MThings连接Modbus物联网平台
  4. 宜家《家居指南》谢幕,是为了彻底拥抱数字化?
  5. ab压力测试之post与get请求
  6. 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)
  7. syswow64删除文件_syswow64,小编教你syswow64是什么文件夹
  8. 纯CSS实现轮播图效果,你不知道的CSS3黑科技
  9. 本创:如何才气建制出劣秀的Facebook游戏?
  10. 那些年,我培养过的大佬