cogs 80. 石子归并 动态规划
80. 石子归并
★★ 输入文件:shizi.in
输出文件:shizi.out
简单对比
时间限制:1 s 内存限制:128 MB
设有N堆沙(shi)子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆(每次合并花费的代价为当前两堆沙子的总数量),这样经过N-1次归并后成为一堆,归并的总代价为每次合并花费的代价和。找出一种合理的归并方法,使总的代价最小。
采用第二种方案可取得最小总代价,值为43。
【输入格式】
输入由若干行组成,第一行有一个整数,n(1≤n≤100);表示沙子堆数。第2至n+1行是每堆沙子的数量。
【输出格式】
一个整数,归并的最小代价。
【输入样例】
输入文件名:shizi.in
7
13
7
8
16
21
4
18
【输出样例】
输出文件名:shizi.out
239
唉 已经多年没有做dp了
我本来dp就一窍不通(暴力走天下)
现在觉得还是练一下为好(暴力并非通用)
这一道题看起来好像还是可以暴力的哦(n<=100)
但是我们用动态规划来弄一下试试
这一道题很显然 是一道动态规划题
我们可以用f[i][j]表示从第i个石子到第j个石子的最小的合并费用
我们当然要再弄一个前缀和的数组 sum[i]表示前i个石子的重量和
状态转移方程竟然想出来了!
f[i][j]=min(f[i][k]+f[k+1][j]+sum[i]-sum[j-1])
那么这个样子就非常的简单了
也就是说i<=k<j
就是说i-k 和 k+1-j 这两石子合并起来 首先要加上原来这两堆石子已经产生的代价 就是两个f 还有这两对石子合并在一起的代价
其实只要状态转移方程想出来了 就都非常简单了
代码也是非常的简短
但是 我却非常完美地想错了
这一道题我直接连样例都没有过 这是为什么呢?
首先先讲一讲 我原来是怎么做错的吧
我原来就是三层循环 ijk 若无其事地跑了一遍 发现结果输出了313
QAQ
这到底是是怎么回事呢?
终于想明白了
这一道题在石子进行合并的时候是先从比较短的长度逐渐合并成大区间的
所以三层循环 第一层应该是区间的长度才对 第二层是i j就是i加上那个区间长度
最后一层是k
然后重点!这一道题的数据范围有坑儿 开105大小70分 115大小80分 最后无奈一下子开了一个205才100的
代码:
#include<bits/stdc++.h>
#define maxn 205
#define ll long long
using namespace std;
int n;
ll dp[maxn][maxn];
ll sum[maxn];
inline int read()
{
int X=; bool flag=; char ch=getchar();
while(ch<''||ch>'') {if(ch=='-') flag=; ch=getchar();}
while(ch>=''&&ch<='') {X=(X<<)+(X<<)+ch-''; ch=getchar();}
if(flag) return X;
return ~(X-);
}
int main()
{
freopen("shizi.in","r",stdin);
freopen("shizi.out","w",stdout);
n=read();
memset(dp,0x3f,sizeof(dp));
for(int i=,x;i<=n;i++)
{
x=read(); sum[i]=sum[i-]+x; dp[i][i]=;
}
// for(int i=1;i<n;i++)
// for(int j=i+1;j<=n;j++)
// for(int k=i;k<j;k++)
// dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
for(int len=;len<n;len++)
for(int Left=;Left<n;Left++)
{
int Right=Left+len;
for(int Middle=Left;Middle<Right;Middle++)
dp[Left][Right]=min(dp[Left][Right],dp[Left][Middle]+dp[Middle+][Right]+sum[Right]-sum[Left-]);
}
printf("%lld",dp[][n]);
return ;
}
cogs 80. 石子归并 动态规划的更多相关文章
- Codevs_2102_石子归并2_(环状动态规划)
描述 http://codevs.cn/problem/2102/ 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目 ...
- Codevs_1048_石子归并_(动态规划)
描述 http://codevs.cn/problem/1048/ 1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Des ...
- Codevs 1048 石子归并
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合 ...
- AC日记——石子归并 51nod 1021
石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...
- codevs 2102 石子归并2
传送门 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将 ...
- codevs 1048石子归并
传送门 1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], ...
- 2102 石子归并 2codevs
2102 石子归并 2codevs 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为 ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- AC日记——石子归并 codevs 1048
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有n堆石子排成一列,每堆石子 ...
随机推荐
- python虚拟环境管理 Pipenv 使用说明
安装 pip install pipenv 检查是否安装成功 pipenv --version 创建虚拟环境(在工程文件夹下) pipenv install 默认下,Pipenv统一管理所有虚拟环境 ...
- docker实战(一)之Tomcat的安装
docker号称分分钟就可以将环境构建完成,这话一点也不假,因为docker在使用软件时只需要从官方 仓库中拉取对应的镜像就行了.docker的使用前需要了解两个名词--镜像和容器.这两 ...
- 【Java中级】(一)面向对象的特性与八种基本类型
1.1.Java 基本数据类型: Java提供了8种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte.short.int.long.float.double. ...
- jsp定义全局变量:读取properties文件
<%java.util.Properties prop = new java.util.Properties();java.io.InputStream in;in = getClass().g ...
- 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧
一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...
- Maven从入门到放弃
1.maven是什么? maven是Apache下的一个纯java开发的一个开源项目,它是一款能够抽象构建过程,并且提供依赖管理,中央仓库,自动下载构建等功能的项目构建工具. 2.为什么要使用mave ...
- 疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )
写在前面: 为了能够使后续的代码具有高效简洁的特点,在这里讲一下STL,就不用自己写堆,写队列,但是做为ACMer不用学的很全面,我认为够用就好,我只写我用的比较多的. 什么是STL(STl内容): ...
- ipv6的连接
基础知识不说了,网上一大堆! 基本内容不说了,写字太累了! 只说三点细节,记住就行: 1.ff开头的是多播地址,只能用于udp多播 2.fe80开头的是本地link地址,不管ping也好,connec ...
- Netty服务端启动过程相关源码分析
1.Netty 是怎么创建服务端Channel的呢? 我们在使用ServerBootstrap.bind(端口)方法时,最终调用其父类AbstractBootstrap中的doBind方法,相关源码如 ...
- Android buildType混淆代码
[话题引入] ①在Android开发完成,我们会将代码打包成APK文件.选择 菜单栏 Build --> Build APK ②将查看视图切换到 Project 模式,文件夹下有一个debug模 ...