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堆石子排成一列,每堆石子 ...
随机推荐
- docker实战(一)之Tomcat的安装
docker号称分分钟就可以将环境构建完成,这话一点也不假,因为docker在使用软件时只需要从官方 仓库中拉取对应的镜像就行了.docker的使用前需要了解两个名词--镜像和容器.这两 ...
- Android系列教程之前言
内容转载自我自己的博客 目前安卓的主流开发语言是Java,在正式开始Android系列的教程之前,需要知道一些基本内容 Android介绍 Android['ændrɔid] 是一个基于Linux 内 ...
- arm汇编指令--str ldr
STR :把寄存器中的字保存到存储器(寄存器到存储器) 示例: STR R0,[R1],#8 :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR ...
- JSP数据交互(一)
1.JSP内置对象:JSP内置对象是 Web 容器创建的一组对象,不用通过手动new就可以使用 2.JSP9大内置对象: 对象名称 类型 request (请求对象) javax.servl ...
- Nginx 的简单使用 (IIS,Asp.Net)
Nginx 的一些常见功能(windows,AspNet ,IIS) 下载 官方网站:https://nginx.org/en/download.html 下载,解压缩是这个样子 启动: 启动方式有两 ...
- 洛谷 P3811 题解
题面 利用暴力快速幂O(nlogn)会TLE掉: 所以对于求1~n的所有逆元要用递推公式: #include <bits/stdc++.h> using namespace std; ]; ...
- 数据类型之Integer与int
数据类型之Integer与int Java入门 基本数据类型 众所周知,Java是面向对象的语言,一切皆对象.但是为了兼容人类根深蒂固的数据处理习惯,加快常规数据的处理速度,提供了9种基本数据类型, ...
- JAVA常用的集合类
package com.xian.test; import java.util.ArrayList; import java.util.Enumeration; import java.util.Ha ...
- go 学习之路(二)
一.文件名 关键字 标识符 所有go源码都以.go结尾 标识符以字母或下划线开头,大小写敏感 a.boy b.Boy c.a+b d.0boy e._boy f.=_boy g._ 以上变量c.d.f ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...