80. 石子归并

★★   输入文件:shizi.in   输出文件:shizi.out   简单对比
时间限制:1 s   内存限制:128 MB

设有N堆沙(shi)子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆(每次合并花费的代价为当前两堆沙子的总数量),这样经过N-1次归并后成为一堆,归并的总代价为每次合并花费的代价和。找出一种合理的归并方法,使总的代价最小。

例如:有3堆沙子,数量分别为13,7,8,有两种合并方案,
第一种方案:先合并1,2号堆,合并后的新堆沙子数量为20,本次合并代价为20,再拿新堆与第3堆沙子合并,合并后的沙子数量为28,本次合并代价为28,将3堆沙子合并到一起的总代价为第一次合并代价20加上第二次合并代价28,即48;
第二种方案:先合并2,3号堆,合并后的新堆沙子数量为15,本次合并代价为15,再拿新堆与第1堆沙子合并,合并后的沙子数量为28,本次合并代价为28,将3堆沙子合并到一起的总代价为第一次合并代价15加上第二次合并代价28,即43;

采用第二种方案可取得最小总代价,值为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. 石子归并 动态规划的更多相关文章

  1. Codevs_2102_石子归并2_(环状动态规划)

    描述 http://codevs.cn/problem/2102/ 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold           题目 ...

  2. Codevs_1048_石子归并_(动态规划)

    描述 http://codevs.cn/problem/1048/  1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Des ...

  3. Codevs 1048 石子归并

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

  4. AC日记——石子归并 51nod 1021

    石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...

  5. codevs 2102 石子归并2

    传送门 2102 石子归并 2  时间限制: 10 s  空间限制: 256000 KB  题目等级 : 黄金 Gold   题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将 ...

  6. codevs 1048石子归并

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

  7. 2102 石子归并 2codevs

    2102 石子归并 2codevs 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为 ...

  8. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  9. AC日记——石子归并 codevs 1048

    1048 石子归并  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有n堆石子排成一列,每堆石子 ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第48波-拆分工作薄内工作表,堪称Excel界的单反

    一个工作薄有多个相同类型的工作表,然后想通过批量操作,把每个工作表都另存为一个工作薄文件,这个批量拆分工作薄,绝大多数插件都有此功能,就如懂点VBA的高级用户也常常有点不屑于用插件来完成,自己写向行V ...

  2. Java_异常介绍

    今日内容介绍: 掌握异常概述 理解异常的基础操作以及最简单的捕获处理 理解多异常捕获处理 理解声明抛出异常 掌握自定义异常 掌握异常处理注意事项 异常 什么是异常?Java代码在运行时期发生的问题就是 ...

  3. 必懂的wenpack优化

    webpack优化 1.production 模式打包自带优化 tree shaking tree shaking是一个术语.通常用于打包时移除js中未引用的代码(dead-code),它依赖于ES6 ...

  4. TIJ学习--RTTI(Runtime-Time Type Identification)

    TIJ学习--RTTI(Runtime-Time Type Identification) RTTI 运行时类型检查机制 获取一个类的Class引用的三种方法 class TestClass{} Te ...

  5. hdoj 4715 Difference Between Primes 素数筛选+二分查找

    #include <string.h> #include <stdio.h> const int maxn = 1000006; bool vis[1000006]; int ...

  6. 全文检索方案Elasticsearch【Python-Django 服务端开发】

    更详细请看 https://www.elastic.co/cn/ 1. 全文检索和搜索引擎原理 商品搜索需求 当用户在搜索框输入商品关键字后,我们要为用户提供相关的商品搜索结果. 商品搜索实现 可以选 ...

  7. 如何在MySQL中输入中文

    解决MySQL中的Incorrect string value MySQL中输入中文:在MySQL建标的时候,直接往表中的varchar(255)中输入中文的话是会报错的,大概是因为数据库的默认编码是 ...

  8. 关于dfs的套路

    void dfs(答案, 搜索层数, 其他参数) { if (层数==maxdeep) { 更新答案 return; } (剪枝) for(下一层可能的状态){ 更新全局变量表示的状态的变量 dfs( ...

  9. 【Java例题】4.4使用牛顿迭代法求方程的解

    4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...

  10. SpringBoot第一天

    一,SpringBoot 介绍 1,如果使用 Spring 开发一个"HelloWorld"的 web 应用: • 创建一个 web 项目并且导入相关 jar 包.SpringMV ...