1. 题目描述
  2. 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
  3. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
  4. 输入输出格式
  5. 输入格式:
  6. 数据的第1行试正整数N,1N100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.
  7. 输出格式:
  8. 输出共2行,第1行为最小得分,第2行为最大得分.
  9. 输入输出样例
  10. 输入样例#1 复制
  11. 4
  12. 4 5 9 4
  13. 输出样例#1 复制
  14. 43

贪心是不行的-.-

最小值 f[i][j]为区间i-j上合并的最小值,则f[i][j]可以通过枚举中间的点k来更新

f[i][j]=min(f[i][j],f[i][k]+f[i][k+1]+sum(i,j))

sum可以使用前缀和

最大值同理

注意这是一个环,用2n的空间存成一条即可

  1. #include<iostream>
  2. using namespace std;
  3. const int MAXN=2000;
  4. const int INF=1<<20;
  5. int n;
  6. int a[MAXN],s[MAXN],f[MAXN][MAXN],g[MAXN][MAXN];
  7. int sum(int x,int y){
  8. return s[y]-s[x-1];
  9. }
  10. int main(){
  11. cin>>n;
  12. for(int i=1;i<=n;i++){
  13. cin>>a[i];
  14. a[i+n]=a[i];
  15. }
  16. for(int i=1;i<=n*2;i++){
  17. s[i]=s[i-1]+a[i];
  18. }
  19. for(int i=2*n;i>=1;i--){
  20. for(int j=i+1;j<i+n;j++){
  21. f[i][j]=INF;
  22. for(int k=i;k<j;k++){
  23. f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum(i,j));
  24. g[i][j]=max(g[i][j],g[i][k]+g[k+1][j]+sum(i,j));
  25. }
  26. }
  27. }
  28. int mnans=INF,mxans=-INF;
  29. for(int i=1;i<=n;i++){
  30. mnans=min(mnans,f[i][i+n-1]);
  31. mxans=max(mxans,g[i][i+n-1]);
  32. }
  33. cout<<mnans<<endl<<mxans;
  34. return 0;
  35. }

[LUOGU] P1880 [NOI1995]石子合并的更多相关文章

  1. 【区间dp】- P1880 [NOI1995] 石子合并

    记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> ...

  2. P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]

    P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...

  3. 洛谷 P1880 [NOI1995]石子合并 题解

    P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...

  4. 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链

    区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...

  5. P1880 [NOI1995]石子合并 区间dp

    P1880 [NOI1995]石子合并 #include <bits/stdc++.h> using namespace std; ; const int inf = 0x3f3f3f3f ...

  6. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

  7. [洛谷P1880][NOI1995]石子合并

    区间DP模板题 区间DP模板Code: ;len<=n;len++) { ;i<=*n-;i++) //区间左端点 { ; //区间右端点 for(int k=i;k<j;k++) ...

  8. 洛谷 P1880 [NOI1995] 石子合并(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...

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

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

随机推荐

  1. assembly x86(nasm)子程序1

    T: 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来.要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示. 思路: Main主调程 ...

  2. 51Nod 1272 最大距离 (栈或贪心)

    #include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...

  3. JQuery中的$().each 以及 $.each的区别

    最近一直在研究JS,今天看到遍历模块的时候,看到了这个函数: $(selector).each(function(index,element)) 但是想想,这个函数和之前项目里面用到的遍历数据的函数不 ...

  4. Django (十) 项目部署 1

    阿里云部署项目 1, 购买阿里云ECS云服务器(可免费试用1个月) 2, 阿里云实例更换为Ubuntu 3, 安全组配置 4, xshell远程连接 5, 创建虚拟环境: 5.1 linux基本命令 ...

  5. Xor-MST Codeforces - 888G

    https://codeforces.com/contest/888/problem/G 这题可以用Boruvka算法: 一开始每个点是一个连通块.每次迭代对于每个连通块找到其最近邻居(与其有边相连且 ...

  6. CSS入门使用

    声明标签 HTML <!DOCTYPE> 内链样式表 <body style="background-color:green;margin:0;padding:0;&quo ...

  7. python入门之流程控制

    if else 格式: if 条件 command1 command2elif 条件: command3    command4 else: command3 command4 注意条件后和else后 ...

  8. 百度Ueditor多图片上传控件

    发现百度的Ueditor富文本编辑器中的多图片上传控件很不错,于是便想着分享出来使用,费了老劲,少不了无名朋友的帮助,也查了不少资料,终于搞定了 发代码给大家,请大家多多指正 1.首先要在html页面 ...

  9. Nodejs 定时任务

    安装扩展:node-schedule npm install node-schedule 1.linux Crontab风格 var schedule = require('node-schedule ...

  10. 解决“程序包管理器控制台”输入命令找不到Nuget包问题

    问题: 问题原因: Nuget源的地址上不去 解决办法: 1.将Nuget源更新为可以国内使用的官方Nuget源. 1)打开VS2013:工具-->Nuget程序包管理器-->程序包管理器 ...