题意:给n堆石子,按照顺序排列,只能相邻两堆石子合并,求最后合并为一堆时所花费的最小代价,石子合并代价为两堆石子之和。



输入:

n(石子堆数)



Xi(每堆石子个数)



输出:

T(最小代价)



思路:经典石子归并问题,区间DP,原谅我对DP并不怎么感冒,简单点来说,首先预处理记下i到j的石子总数,用数组存放,然后在DP的过程中,因为求解的是最小代价,我们可以这样想,先找出两堆石子所有情况中最小的,然后再这个基础上依次转移到三堆,四堆,直到n堆,所以复杂度n^3,在每堆情况里面,状态转移方程为
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);这里i-k是一堆,(k+1)-j是一堆,然后要加上这两堆的花费之和,所以递归求解就可以得到1-n堆石子最小代价花费了。

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
#define M 101
#define MAX 10000000
int n,dp[M][M],sum[M][M],s[M];
int main()
{
int i,j,k;
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&s[i]);
sum[i][i]=s[i];
for(j=i+1; j<=n; j++)
sum[i][j]=sum[i][j-1]+s[j];
}
for(int k=2; k<=n; k++)
{
for(i=1; i<=n-k+1; i++)
{
j=i+k-1;
dp[i][j]=MAX;
for(k=i; k<=j-1; k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);
}
}
printf("%d\n",dp[1][n]);
return 0;
}

NYOJ737的更多相关文章

  1. 石子归并问题(nyoj737)

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

  2. nyoj737 石子合并(一) 区间DP

    dp[x][y]表示合并[x, y]区间的石子的最小花费,将区间长度递增枚举即可. AC代码: #include<cstdio> #include<algorithm> usi ...

  3. NYOJ737石子合并(二)-(区间dp)

    题目描述:     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出 ...

  4. nyoj737石子合并(一)

    先得出区间为1和2时的结果.用arr[i][j]记录i,j内的和.dp[i][j]记录i,j区间全加起来的最小花费.那么区间大小为1和2时都是明显的.为3时枚举断点.其中一个区间大小为1也是可行的. ...

  5. nyoj737区间dp(石子合并)

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

  6. 石头合并 NYOJ737 区间dp

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB ...

  7. [nyoj737]石子归并(区间dp入门题)

    题意:有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...

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

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

  9. 专题训练之区间DP

    例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...

随机推荐

  1. Linux安装Monaco字体

    Linux安装字体的方式其实很简单,就是调用 fc-cache -f -v 命令,其实我们可以什么都不添加直接调用这个命令可以看到它会去/usr/share/fonts/truetype等目录以及你自 ...

  2. bash shell学习-正则表达式基础 (笔记)

    A gentleman is open-minded and optimistic; a small person is narrow-minded and pessimistic. "君子 ...

  3. 10分钟 教你学会Linux/Unix下的vi文本编辑器

    10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...

  4. jquery mobile navbar

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. MLlib 编程指导-spark-1.2.0

    本文来自 http://spark.apache.org/docs/latest/mllib-guide.html 官方文档翻译 个人翻译 MLlib包括的算法和工具主要有:分类,回归,聚类,协同过滤 ...

  6. 基于OSGi的企业级快速开发平台(开源)

    模块化.插件化是未来的主流趋势,他很好的解决了,公司知识的积累.应用分发.商务模式.快速构建等一系列问题,国外著名的插件化平台JIRA就非常成功,国内的目前很多公司在偿试插件化的开发模式,作为平台推出 ...

  7. JDBC与javaBean

    1.JDBC的概念: Java数据库连接技术(Java DataBase Connectivity)能实现java程序对各种数据库的访问, 由一组使用java语言编写的类 和 接口(jdbc api) ...

  8. java开发规范

    hbh 开发规范文档 一:目的 使本组织能以标准的,规范的方式设计和编码.通过建立编码规范,以使每个开发人员 养成良好的编码风格和习惯:并以此形成开发小组编码约定,提高程序的可靠性,可读性, 可修改性 ...

  9. Ant快速入门(三)-----定义生成文件

    适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系. Ant生成文件的默认名为build.xm ...

  10. android host

    74.125.20.31 market.android.com 74.125.20.31 developer.android.com 74.125.20.31 android.googlesource ...