蒟蒻做NOI系列的题,好慌......

题目描述

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

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出格式:

输出共2行,第1行为最小得分,第2行为最大得分.

输入输出样例

输入样例#1:

4
4 5 9 4

输出样例#1:

43
54

解析:

本蒟蒻第一次膜拜NOI这么难的题,,,据说这题很多人用贪心做,导致直接爆了30。。。本人虽然一上来就知道这绝对是道DP(绿题怎么可能是贪心~~~),但是是在orz了许多大佬的题解和董永建新出的某本书后才想出了正解。。。没办法,我反射弧长下面我就来和大家分享一下这道题的解法。这道题属于动态规划中的“区间DP”,顾名思义,区间DP是以区间长度作为阶段的,在本题中,所谓的“区间长度”其实可以形象地理解成一段区间合并的花费。让我们先从最简单的情况入手。假设现在这里有一条链(先不考虑环),有四个数,分别是1,2,3,4。它们合并de情况有很多种,从最终状态考虑。分别是【(1),(2,3,4)】【(1,2),(3,4)】【(1,2,3),(4)】这三种;毫无疑问,肯定是最后一种情况最省花费,研究它会发现,我们应该在(1,2,3)中再寻找最省花费的合并方法,而这些方法跟后边的合并显然没有关系,这也就符合无后效性原则。接下来我们再把它抽象一点,假如我们现在得到了一条链。并且我们只需要去做最后的合并。把这两部分合并起来,显然是左边的已有花费加上右边已有花费再加上他们的和(每次合并的花费)以此类推到更多堆石子的情况。对于j到end之间的石子,去枚举“界限”,设在第k堆石子处分开,也就是第j到k堆合并,第k到end堆合并。就有了状态转移方程:(f[i][j]表示i堆到j堆最小花费,g[i][j]表示从i堆到j堆最大花费)
f[j][end]=min(f[j][end],f[j][k]+f[k+1][end]+sum(j,end));
g[j][end]=max(g[j][end],g[j][k]+g[k+1][end]+sum(j,end));

 还有一个比较难想的事情是如何把环转化成链,本蒟蒻的第一想法是去枚举端点,每次枚举一次,做一次DP,可是这样就是O(n4)的时间复杂度,即使对于n<=100来说也太大了。

于是董永建老人家为我们提供了一个更妙的思想。把这个环储存成一个更大的链。每次去枚举开头,自然就有了结尾。而且每种断开的方法都是这条链的字串(不是子序列!!!)。

最后打擂台取最大值即可。

还有一点,经常被人们忽略,就是调用的状态是否已经计算过。对于这道题,循环变量i表示在做第i-1次合并,所以合并是由小到大的,之前的状态是已经计算过的。

最后上AC代码

#include<iostream>
#include<cstring>
using namespace std;
int n,a[301],Prefix[200],end,f[205][205],g[205][205],maxn,minn=21370444;//Prefix前缀和,只需要进行线性的预处理,即可享受常数的求和方法(手动滑稽)(蒟蒻英语不好,上网百度的)
int sum(int i,int j)//求第i堆到第j堆的和
{return Prefix[j]-Prefix[i-1];
}
int main()
{memset(f,20,sizeof(f));//初始化cin>>n;for(int i=1;i<=n;i++){cin>>a[i];a[i+n]=a[i];//构造更长的链}for(int i=1;i<=n*2;i++){Prefix[i]=a[i]+Prefix[i-1];//打前缀和f[i][i]=0;//自己和自己合并不需要花费g[i][i]=0;}for(int i=2;i<=n;i++){for(int j=1;j<=2*n-i+1;j++)//j表示合并的左端点{end=i+j-1;//end表示合并的右端点for(int k=j;k<end;k++)//枚举断点{f[j][end]=min(f[j][end],f[j][k]+f[k+1][end]+sum(j,end));g[j][end]=max(g[j][end],g[j][k]+g[k+1][end]+sum(j,end));}}}for(int i=1;i<=n;i++)//打擂台求最大最小{maxn=max(g[i][i+n-1],maxn);minn=min(f[i][i+n-1],minn);}cout<<minn<<endl<<maxn<<endl;return 0;//终于结束了。。。
}

  

附上原题地址~~~:https://www.luogu.org/problemnew/show/P1880 ;祝大家NOIP2019 RP++~~~

转载于:https://www.cnblogs.com/szmssf/p/10802339.html

P1880 [NOI1995]石子合并相关推荐

  1. P1880 [NOI1995] 石子合并 的详解

    P1880 [NOI1995] 石子合并 [题目网站] [NOI1995] 石子合并 - 洛谷 [题目考点] 区间动态规划 [题目思路] 输入数组,把长度翻倍 初始化最小值数组 一个一个区间地填 找出 ...

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

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

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

    放题解 题目传送门 放代码 转载于:https://www.cnblogs.com/liuyuxinblog/p/10799085.html

  4. luogu P1880 [NOI1995]石子合并

    咕咕咕 说好把济南集训时做的题写写题解还是鸽了然后因为太无聊又来续上了w 传送门~xiu 一道dp 具体是啥dp呢我去看看题解咋说 嗯 区间dp(跟我想的一样 把环拆成链来做 n的范围比较小就直接枚举 ...

  5. [NOI1995]石子合并

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

  6. 石子合并(洛谷-P1880)

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

  7. 石子合并[DP-N3]

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

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

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

  9. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp

    文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...

最新文章

  1. Nature综述|预测生物学:微生物复杂性的解析、模拟与应用
  2. Pandas 基础(9) - 组合方法 merge
  3. Git最最常用的命令
  4. ecm工作原理 usb_“好玩具”来了!往你的USB端口里藏入一个小开发板...
  5. 使用numpy.tanh()打印矢量/矩阵元素的双曲正切值 使用Python的线性代数
  6. WorkManager从入门到实践,有这一篇就够了
  7. orm2 中文文档 2. 设置
  8. linux源码acl,Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍...
  9. Java语言程序设计(一)填空题
  10. Java(58):maven test 运行特定单元测试类
  11. Unity针对文件进行MD5码校验
  12. java手机连点脚本_自动点击连点器下载
  13. Python爬虫实战 | (10) 爬取猫眼电影《海王》影评并存入MySql数据库
  14. 计算机配置35%卡住不动了,win7配置更新35%不动怎么回事_win7配置windows update完成35卡住不动了如何解决...
  15. 一学就会的 WordPress 实战课
  16. python动态监控日志内容
  17. 【程序员笑话】让你泪流满面的瞬间
  18. Placement blockage types
  19. 全球水深地形模型ETOPO1
  20. 全景分割相关论文写作与准备笔记

热门文章

  1. 归并排序 | 递归 非递归 |C语言
  2. 64位计算机打不开网页,打不开网页,教您如何解决网页打不开的问题
  3. Qt之arm使用openssl(RSA加密)
  4. 二冲港交所,嘀嗒出行“顺风车领头羊”的故事真的动听吗?
  5. 常见词缀发音——前缀
  6. 【产品经理学习笔记】Part 9 交互设计(1)
  7. 10道必会jQuery面试题-蛙课网
  8. win10电脑如何录屏
  9. 2021年高压电工考试资料及高压电工操作证考试
  10. vue springboot 会员收银系统 (1)