dp2--合并石子(一)

一、心得

二、题目

石子合并(一)

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
    有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
 
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239
来源
经典问题

三、分析

* 合并石子.cpp
* 分析:
* 状态:
* f[i][j]表示把第i堆石子到第j堆石子合并成一堆的最小代价
* sum[j]表示第1堆石子到第j堆石子的和
* 最终状态:
* f[1][n]
* 初始状态:
* f[i][i]=0;
* 状态转移方程:
* 假设最后一次合并是将(i,k)和(k+1,j)合并
* f[i][j]=min(f[i][k]+f[k+1][j]+sum[j]-sum[i-1]) (k>=i&&k<=j)

dp过程图

四、AC代码

242ms

 /*
* 合并石子.cpp
* 分析:
* 状态:
* f[i][j]表示把第i堆石子到第j堆石子合并成一堆的最小代价
* sum[j]表示第1堆石子到第j堆石子的和
* 最终状态:
* f[1][n]
* 初始状态:
* f[i][i]=0;
* 状态转移方程:
* 假设最后一次合并是将(i,k)和(k+1,j)合并
* f[i][j]=min(f[i][k]+f[k+1][j]+sum[j]-sum[i-1]) (k>=i&&k<=j)
*
*
*/ #include <iostream>
#include <cstdio>
using namespace std;
int f[][];
int sum[];
int a[]; //用来存这n堆石子
int n; void readData() {
for (int i = ; i <= n; i++) {
cin >> a[i];
}
} void printRead() {
cout << "n:" << n << endl;
for (int i = ; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
} void initArr_sum() {
sum[] = ;
for (int i = ; i <= n; i++) {
sum[i] = a[i] + sum[i - ];
}
} void printArr_sum() {
for (int i = ; i <= n; i++) {
cout << sum[i] << " ";
}
cout << endl;
} void initArr_f() {
//把上一轮的数据清空
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
f[i][j] = 0xfffffff;
}
}
//初始化
for (int i = ; i <= n; i++) {
f[i][i] = ;
}
} void printArr_f() {
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
cout << f[i][j] << " ";
}
cout << endl;
}
} void init() {
readData();
//printRead();
initArr_sum();
//printArr_sum();
initArr_f();
//printArr_f();
} void dp() {
for (int i = n; i >= ; i--) {
for (int j = i + ; j <= n; j++) {
for (int k = i; k <= j; k++) {
f[i][j] = min(f[i][j],
f[i][k] + f[k + ][j] + sum[j] - sum[i - ]);
}
}
}
} void printAns() {
cout << f[][n] << endl;
} int main() {
//freopen("src/in737.txt", "r", stdin);
while (scanf("%d", &n)==) {
init();
dp();
//printArr_f();
printAns();
} return ;
} /*
* 注意点:
* 1、因为求最小值,所以f要初始化为较大值
* f[i][j] = 0xfffffff;
*/

五、注意点

1、因为求最小值,所以f要初始化为较大值
f[i][j] = 0xfffffff;

dp2--合并石子(一)的更多相关文章

  1. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  2. dp优化-四边形不等式(模板题:合并石子)

    学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...

  3. 合并石子(dp)

    合并石子 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 7[提交][状态][讨论版][命题人:quanxing] 题目描述 在一个操场上一排地摆放着N堆石子.现要将石子有次序 ...

  4. CodeForces-884D:Boxes And Balls(合并石子)

    Ivan has n different boxes. The first of them contains some balls of n different colors. Ivan wants ...

  5. Java实现 蓝桥杯 算法提高 合并石子

    算法提高 合并石子 时间限制:2.0s 内存限制:256.0MB 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数 ...

  6. ny737 石子合并(一) 总结合并石子问题

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

  7. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  8. 算法提高 合并石子(DP)

    问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...

  9. nyoj 题目737 合并石子(一)

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的 ...

  10. CSUOJ 1952 合并石子

    现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input 第一行包含一个整数T(T<=50 ...

随机推荐

  1. websocket Session 不支持序列化

    这是我本来的打算,把socket session 进行序列化分布式存储! 呵呵   然而现实很残酷,这b东西不支持序列化! 解决办法:

  2. 你意识到苹果公司已经抛弃了GC吗?

    为什么移动Web应用程序很慢(译) - tangzhnju - 博客园 http://www.cnblogs.com/codemood/p/3213459.html

  3. Encrypt your home directory

    w

  4. 费马小定理 Fermat Theory

    w 整数的质数次方和自身的差是是质数的倍数 费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1)≡1(mod p).即: ...

  5. 云原生应用开发12-Factors

    英文地址:https://12factor.net/ 中文地址:https://12factor.net/zh_cn/ 文章内容 简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软 ...

  6. CSS 中z-index全解析(摘自阿里西西)

    z-index全解析 Z-index属性决定了一个HTML元素的层叠级别.元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言.一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶 ...

  7. dataTables的用法

    原地址:http://blog.csdn.net/mickey_miki/article/details/8240477 1.DataTables的默认配置 $(document).ready(fun ...

  8. Loadrunder场景设计篇——手工场景设计

    概述 通过选择需要运行的脚本,分配运行脚本的负载生成器,在脚本中分配Vuser来建立手工场景 手工场景就是自行设置虚拟用户的变化,主要是通过设计用户的添加和减少过程,来模拟真实的用户请求模型,完成负载 ...

  9. 大型网站系统与 Java 中间件实践

    http://wanglizhi.github.io/2016/07/27/JavaWeb-And-MiddleWare/ 第一章 分布式系统介绍 分布式系统的定义:组件分布在网络计算机上,组件间仅仅 ...

  10. http://www.uupoop.com/ps/

    网页版PS,在线PS 基本的PS功能都有,最重要的一点是快,网页版的嘛,哼哼!