ssl2863-石子合并【dp练习】
Description
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。
Input
每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。
Output
对于每组数据输出一个正整数,即最小得分
Sample Input
7
13
7
8
16
21
4
18
Sample Output
239
解题过程
这道题老师讲过所以很快就Ok了(其实主要是看书),首先在书上找出求出动态转移方程,我们可以用f[i][j]表示从i到j堆石头的最优解。
然后用s[i][j]表示从i-j石子堆的和。优化一下可以用s[i]表示前i堆的和,让后s[j]-s[i-1]就可以做到s[i][j]的效果。
在枚举一个k表示从i-j的第k个开始分,就可以求出来了。
然后动态转移方程:f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1])
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,x,s[101],f[101][101];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
s[i]=s[i-1]+x;//s[i]表示前i堆的总和
}
memset(f,127/3,sizeof(f));//给f赋值一个很大的数
for (int i=1;i<=n;i++) f[i][i]=0;//预处理
for (int i=n-1;i>=1;i--)//从n-1开始枚举头
for (int j=i+1;j<=n;j++)//这样枚举可以从少堆的开始枚举
for (int k=i;k<=j-1;k++)//枚举分裂点
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
//动态转移方程
printf("%d\n",f[1][n]);//输出从1-n堆最优解
}
ssl2863-石子合并【dp练习】相关推荐
- CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并
题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...
- 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp
文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...
- SDNU 1048.石子合并2(区间dp)
Description 有n堆石子排成一圈,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...
- SDNU 1045.石子合并1(区间dp)
Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...
- 区间DP初探 P1880 [NOI1995]石子合并
https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...
- 动态规划 —— 区间 DP —— 石子合并三讲
石子合并问题是最经典的 DP 问题,其有如下3种题型: [任意合并] 1.问题: 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量.求 ...
- AcWing.282石子合并(区间DP)题解
石子合并 题目描述 设有N堆石子排成一排,其编号为1,2,3,-,N. 每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆. 每次只能合并相邻的两堆,合并的代价为这两堆石子的质 ...
- 区间DP之环形石子合并
环形石子合并 题目传送门 题目描述 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆. 规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆 ...
- Nyoj 737: 石子合并(一)(区间DP+四边形优化)
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
- 石子合并——最经典的dp问题
石子合并三大题型 任意两堆石子合并,直接手写一个小根堆,每次取前面两个相加,得到的值继续放入优先队列中,直到里面只有一个元素就输出 只能合并相邻两堆石子,这就类似于矩阵连乘(传送门),不过还是有一些差 ...
最新文章
- 【Caffe实践】 多目标输出探究
- 02.规划过程组表格-需求管理计划
- 在WinCE 6.0系统下实现USB功能定制
- Codeforces 55D Beautiful numbers (数位DP)
- 关于使用pietty或putty终端连接ubuntu虚拟机时报被拒绝连接问题
- 大动作!华为海思注册资本从6亿增加到20亿
- STM32,你了解多少?(转载)
- Nagios 监控redis
- 加州理工学院公开课:机器学习与数据挖掘_神经网络
- 微软 .NET 团队宣布 Visual Basic 停止更新,VB 编程即将谢幕
- 当当网价格系统架构分析
- cron在线生成表达式
- Excel 如何锁定表头
- 高并发场景设计与解决方案
- Discuz X 多页面专题制作教程
- Deep Learning学习笔记(5)——AlphaGo
- python交互数据_Python用户交互以及数据类型
- 华为云CDN加速服务:让你体验不一样的云提速
- 我,新媒体运营,却连语文都没考及格!
- 小白零基础教学:用自助BI工具搭建领导驾驶舱
热门文章
- linux编程两个子进程,Linux中fork同时创建多个子进程的方法
- es6添加删除class_es6中class类的使用
- php绘制饼图,php怎么绘制饼图?
- java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...
- [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
- [设计模式]抽象工厂模式
- LeetCode 82 删除排序链表中的重复元素||-中等
- AcWing 312. 乌龟棋
- Circle and Points POJ - 1981(单位圆覆盖最多点)
- 数据结构与索引-- B+树索引