题目链接 :http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737


这个动态规划的思是,要得出合并n堆石子的最优答案可以从小到大枚举所有石子合并的最优情况,例如要合并5堆石子就可以从,最优的2+3和1+4中得到最佳的答案。从两堆最优到三堆最优一直到n堆最优。
状态转移方程式:dp [ i ] [ j ] = min(dp [ i ] [ k ] + dp [ k+1 ] [ j ])


复杂度为o(n^3)

#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn],sum[maxn];
int main()
{int n;while(scanf("%d",&n) != EOF){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){int now;scanf("%d",&now);sum[i] = sum[i-1] + now;}for(int l=2;l<=n;l++)//从i开始长度为l合并的最优答案for(int i=1;i<=n-l+1;i++){int j = i + l - 1;dp[i][j] = 0x7f7f7f7f;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]);}printf("%d\n",dp[1][n]);}return 0;
}

经过平行四边形优化之后复杂度为o(n^2)
平行四边形优化https://baike.baidu.com/item/%E5%9B%9B%E8%BE%B9%E5%BD%A2%E4%B8%8D%E7%AD%89%E5%BC%8F?fr=aladdin

/*由平行四边形原理可得,s[i-1][j]<=s[i][j]<=s[i+1][j]*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn],sum[maxn],s[maxn][maxn];void init(int n)
{memset(dp,0,sizeof(dp));memset(s,0,sizeof(s));for(int i=1;i<=n;i++){int now;scanf("%d",&now);s[i][i] = i;sum[i] = sum[i-1] + now;}
}int main()
{int n;while(scanf("%d",&n) != EOF){init(n);for(int l=2;l<=n;l++)for(int i=1;i<=n-l+1;i++){int j = i+l-1;dp[i][j] = 0x7f7f7f7f;for(int k=s[i][j-1];k<=s[i+1][j];k++){if(dp[i][j] > dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]){dp[i][j] = dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];s[i][j] = k;}}}printf("%d\n",dp[1][n]);}return 0;
}

转载于:https://www.cnblogs.com/GoldenFingers/p/9107253.html

经典:区间dp-合并石子相关推荐

  1. USACO / A Game (经典区间DP)

    A Game游戏 IOI'96 - Day 1 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的两端取数,取数后该数 ...

  2. 区间dp——合并金币

    链接:https://www.nowcoder.com/questionTerminal/6d3ccbc5b6ad4f12b8fe4c97eaf969e0 来源:牛客网 有 N 堆金币排成一排,第 i ...

  3. LeetCode 1000. 合并石头的最低成本(经典区间DP)

    1000. 合并石头的最低成本 定义dp[i][j]为尽可能多的合并区间[i, j] 所需的成本,不一定能合并成一堆,但合并完成后剩下的堆数一定小于k,更具体地,剩余的堆数一定是(n - 1) % ( ...

  4. Leetcode 312. 戳气球(经典区间dp)

    为了避免边界问题,我们重新开一个数组,在两个端点加入哨兵1.此时数组下标为0到n+1 状态的定义如下,f[i][j] 表示将区间[i+1,j-1]的气球全部戳爆的最大收益. 我们要求的答案就是f[0] ...

  5. 区间dp入门——总结+习题+解析

    前天学长拉了个区间dp的专题,花了两个做,今天就来做个总结吧!!! 区间dp其实就是一种建立在线性结构上的对区间的动态规划,dp本来就是很奇妙的东西,也没有什么套路,就是一种思考的数学思维方式,只有做 ...

  6. 算法讲解 -- 区间dp经典模型与优化(石子归并)

    石子合并问题是最经典的DP问题.首先它有如下3种题型: PPT讲解:点击打开链接 (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数 ...

  7. 区间DP初探 P1880 [NOI1995]石子合并

    https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...

  8. 石子合并——最经典的dp问题

    石子合并三大题型 任意两堆石子合并,直接手写一个小根堆,每次取前面两个相加,得到的值继续放入优先队列中,直到里面只有一个元素就输出 只能合并相邻两堆石子,这就类似于矩阵连乘(传送门),不过还是有一些差 ...

  9. CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并

    题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...

  10. 合并石子 区间dp水题

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

最新文章

  1. 因为名字叫True,她被苹果iCloud服务器拒绝了
  2. 柔宇冲刺科创板IPO:3年营收5亿净亏31亿,乐视掘墓人刘姝威坐镇董事会
  3. caffe学习(六):使用python调用训练好的模型来分类(Ubuntu)
  4. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  5. lisp的vla函数画矩形_python之:tkinter画哆啦A梦
  6. 物联网赚钱三大步骤浅析
  7. Smart field 1 how is smartField controller loaded - how is main view defined in manifest.json
  8. for else语句小tips : RUNOOB python练习题36
  9. QQ批量自动登录程序的设计
  10. C# 使用Newtonsoft.Json读写Json文件
  11. IDEA 解决一直加载Refreshing VCS history
  12. Matlab基础绘图(一)-plot()
  13. 魔方:公式记忆(三字诀)
  14. WPS广告弹窗永久关闭
  15. Spark大数据技术与应用期末总结大题
  16. JAVA编写元音字母(Switch语句)
  17. 基于JavaEE的游泳馆管理系统_JSP网站设计_SQLServer数据库设计
  18. Docker学习01---狂神说
  19. 51单片机中断详解(上)
  20. 灰度值 与 RGB值 及其转换

热门文章

  1. 上升沿_PLC上升沿,下降沿的理解
  2. mysql 3种报错_MySQL读取Binlog日志常见的3种错误-阿里云开发者社区
  3. python数据挖掘电影评分分析_Pyhon数据分析项目——男女电影评分差异比较
  4. sts java配置tomcat_STS配置Tomcat.9.0
  5. python 修改array_python 基础_ 数组的 增删改查3
  6. ppt修复无法读取_移动硬盘故障分析以及建议修复方法
  7. Win32ASM代码基本模块
  8. java web核心知识_JAVA web 相关知识点
  9. 《MySQL——count()逻辑》
  10. java 字谜_计算字谜的出现次数