Problem Description

一条直线上摆放着一行共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。

Input

输入有多组测试数据。

每组第一行为n(n<=100),表示有n堆石子,。

二行为n个用空格隔开的整数,依次表示这n堆石子的石子数量ai(0<ai<=100)

Output

每组测试数据输出有一行。输出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。 中间用空格分开。

Sample Input

3

1 2 3

Sample Output

9 11

思路:石子合并问题之直线下的相邻合并,具体思路:点击这里

Source Program

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 1001
#define MOD 10007
#define E 1e-6
#define LL long long
using namespace std;
int a[N];
int sum[N];
int dp[N][N];
int main()
{int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}memset(dp,INF,sizeof(dp));for(int i=1;i<=n;i++)dp[i][i]=0;for(int len=1;len<n;len++){for(int i=1;i<=n-len;i++){int j=i+len;for(int k=i;k<j;k++)dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);dp[i][j]+=sum[j]-sum[i-1];}}printf("%d ",dp[1][n]);memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)dp[i][i]=0;for(int len=1;len<n;len++){for(int i=1;i<=n-len;i++){int j=i+len;for(int k=i;k<j;k++)dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);dp[i][j]+=sum[j]-sum[i-1];}}printf("%d\n",dp[1][n]);}return 0;
}

石子合并问题--直线版(Hrbust-1818)相关推荐

  1. P1775 石子合并(弱化版)(区间DP)

    题目链接:石子合并(弱化版) - 洛谷 分析:这个显然就是一个区间DP,定义f[i][j]为将第i~j堆石子合并成一堆石子所需要的最小代价,我们可以枚举最后一次将第i~j堆石子合并成一堆石子是以k为分 ...

  2. P1775 石子合并(弱化版)(区间dp模板)

    石子合并(弱化版) - 洛谷 /** @Description: To iterate is human, to recurse divine.* @Autor: Recursion* @Date: ...

  3. 洛谷P1775 石子合并(弱化版)

    原题传送门 题目描述 设有 N(N≤300)N(N \le 300)N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N1,2,3,\cdots,N1,2,3,⋯,N.每堆石子有一定的质量 m ...

  4. 單子の题解:直线石子合并

    單子の题解:直线石子合并 题目描述 题目核心 代码实现 题目描述 古娜拉黑暗之神. 题目核心 状态表示:dp[i][j]表示从i到j的合并最小代价 列举每个小区间i,j的代价 左右两堆合成的最小代价= ...

  5. 【动态规划】小石子游戏-石子合并

    题目 一群小孩子在玩小石子游戏,游戏有两种玩法. (1)路边玩法 有n堆石子堆放在路边,现要将石子有序地合并成一堆,规定每次只能移动相邻的两堆石子合并,合并花费为新合成的一堆石子的数量.求将这N堆石子 ...

  6. 动态规划 —— 区间 DP —— 石子合并三讲

    石子合并问题是最经典的 DP 问题,其有如下3种题型: [任意合并] 1.问题: 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量.求 ...

  7. 租用游艇问题 石子合并问题 动态规划实验

    实验名称:动态规划 一.实验预习 1.实验目的 1. 理解并掌握动态规划方法的设计思想: 2. 提高应用动态规划方法解决问题和设计算法的能力: 3. 通过编程实现租用游艇问题和石子合并问题,进一步理解 ...

  8. 石子合并——最经典的dp问题

    石子合并三大题型 任意两堆石子合并,直接手写一个小根堆,每次取前面两个相加,得到的值继续放入优先队列中,直到里面只有一个元素就输出 只能合并相邻两堆石子,这就类似于矩阵连乘(传送门),不过还是有一些差 ...

  9. SSL_1597 石子合并问题

    Description 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将 ...

最新文章

  1. 算法-----三数之和等于0
  2. php和python对比-python与java、php、go的优势对比
  3. 手把手教你刷新BACKUP Bios
  4. php 正则 菜鸟,PHP正则表达式基础入门
  5. OpenCASCADE:构建配置文件
  6. 使用OpenCV玩家营造出一个视频控制(没有声音)
  7. 查看、关闭被占用的端口
  8. ubuntu 如何在任意终端不填加./就可以执行文件类似ls cd cp
  9. 《textanalytics》课程简单总结(1):两种word relations——Paradigmatic vs. Syntagmatic...
  10. mysql设计与实现_mysql设计与开发
  11. java mybatis 代码生成器_Java MyBatis-Plus 代码生成器
  12. Mac MySQLdb模块安装,可算解决了
  13. 图书管理系统~简单流程
  14. 中国的房子其实是不断贬值的
  15. ubuntu 下 imagick PHP扩展的安装
  16. 安卓rom制作教程_MIUI官改篇对比分析-极光ROM-台湾W大-星空未来-其他官改官网
  17. 8086汇编语言(一) 汇编语言源程序
  18. 谷歌Chrome浏览器不再支持Flash Player的完全解决方案
  19. STM32控制SG90舵机与超声波HC_SR04测距模块
  20. 网络设置里计算机为什么有两个字,一计算机网络操作题.doc

热门文章

  1. 2018世界杯数据清单:真球迷看球必备,伪球迷速成指南(附完整赛程)
  2. 这个没去大厂的程序猿,用 4 年时间证明自己做对了!
  3. Spring中异步注解@Async的使用、原理及使用时可能导致的问题
  4. 用了这么多年的 Java 泛型,你对它到底有多了解?
  5. 别再用Else语句写代码了!
  6. Serverless实战之路
  7. JEECG 树列表操作总刷新列表,需要重新展开问题 【官方补丁,适用所有版本】
  8. 自适应移动设备页面的设计
  9. hadoop--Reduce Join
  10. elasticsearch部署