题目名我已经无力吐槽。

Description

A:你是萝莉控吗?
B:。。。。。我给你道题目吧!
有一个长度为nn的正整数数组AA,满足Ai>=Ai+1A_i >= A_{i+1},现在构造一个数组BB,令Bi=∑nj=iBjB_i = \sum_{j = i}^{n}B_j。
现在,有一个n∗nn * n的网格图,左下角坐标是(1,1)(1, 1),右上角坐标是(n,n)(n, n)。有一个人正在坐标为(n,1)(n, 1)的位置,每一时刻,如果他现在在(x,y)(x, y),他可以选择走到(x−1,y+1)(x-1,y + 1)或者(x,⌈y/2⌉)(x, \lceil y/2\rceil),如果选择后者,他要支付BxB_x的代价。
现在他想走到(1,1)(1, 1),你可以告诉他他支付的代价最少是多少吗?注意在任何时候他都不能离开这个网格图。

Burte Force

模拟。
直接走。搜索。30分。
其实这个搜索可以写成DP。

Fi,j=min(Fi+1,j−1,Fi,j∗2+Bi,Fi,j∗2−1+Bi)

F_{i,j} = min(F_{i + 1,j - 1} , F_{i , j * 2} + B_i , F_{i , j * 2 - 1} + B_i)
这就60了。

Analysis

根据这题的DP式,我们想到一个老朋友:哈夫曼树。
首先【前提】,你得对哈夫曼树的DP形式足够熟悉。
哈夫曼树的点,我们按照权值CiC_i从小到大排序,依次加入树中。
我们设Gi,jG_{i,j}表示当前正在把第ii个点放进哈夫曼树里,此时树上有jj个空节点的最小代价。所谓空节点,就是放了不用增加代价的点(Gi,jG_{i,j}中预支了剩余的点放在这jj个空节点的代价)
那么转移就很明郎了。我们用顺推来便于记忆和理解。

Gi,j⇒Gi+1,j−1  ,  Gi,j+∑j=inCj⇒Gi,j∗2

G_{i,j} \Rightarrow G_{i + 1 , j - 1} ~~ , ~~ G_{i,j}+\sum_{j = i}^n C_j \Rightarrow G_{i,j * 2}
也就是说,当前状态下,要么把ii塞到jj个空位的某一个里面,要么把每个空位都变成辅助节点,这样每个空位就都能多挂一个叶子节点了。相应的,这样一来剩下的所有空位置【能放的叶子节点】到根的距离都多了1,由于这些位置是为i→ni\to n准备的,所以代价要加上∑nj=iCj\sum_{j = i}^n C_j
答案就是min(Gn+1,k  0≤k≤maxj)min(G_{n + 1 , k_{~~0 \leq k \leq maxj}})
你问我为什么要每个空位都变成辅助节点?难道不能单开一个或者仅仅是几个吗?
因为这样状态是重复的。假如我们仅仅单开了kk个空位变成辅助节点,总空位数一定可以由之前的某个状态的空位置数推导而来,所以我们只需要考虑一起开就好了。

这就是哈夫曼树的DP形式。
关于哈夫曼树的经典算法我们就不赘述了,O(nlogn)O(n\log n)。

这和我们这一题有什么关系呢?

Fi,j=min(Fi+1,j−1,Fi,j∗2+Bi,Fi,j∗2−1+Bi)

F_{i,j} = min(F_{i + 1,j - 1} , F_{i , j * 2} + B_i , F_{i , j * 2 - 1} + B_i)

把BB展开

Fi,j=min(Fi+1,j−1,Fi,j∗2+∑j=inAj,Fi,j∗2−1+∑j=inAj)

F_{i,j} = min(F_{i + 1,j - 1} , F_{i , j * 2} + \sum_{j = i}^n A_j , F_{i , j * 2 - 1} + \sum_{j = i}^n A_j)

Gi,j⇒Gi+1,j−1  ,  Gi,j+∑j=inCj⇒Gi,j∗2

G_{i,j} \Rightarrow G_{i + 1 , j - 1} ~~ , ~~ G_{i,j}+\sum_{j = i}^n C_j \Rightarrow G_{i,j * 2}

GG和FF是不是非常的像,简直就是逆过程!除了最后一项。

我们考虑一下Gi,j∗2G_{i , j * 2} 和 Gi,j∗2−1G_{i , j * 2 - 1}的差别。同是由Gi,jG_{i,j}推过来的,少一个空位难道会比多一个空位更优吗?显然是不会的,暂且不论这个空位能不能用上,Gi,j∗2≤Gi,j∗2−1G_{i , j * 2} \leq G_{i , j * 2 - 1}

我们来检测一下。
CC是递增的,AA也是。
G1,1=0G_{1,1} = 0 求的是 min(Gn+1,k  0≤k≤maxj)min(G_{n + 1 , k_{~~0 \leq k \leq maxj}})
Fn+1,0=0F_{n + 1, 0} = 0 求的是 F1,1F_{1 , 1}
这里产生了一点差异,就是Fn+1,0F_{n + 1, 0},那么我们的min(Gn+1,k  0≤k≤maxj)min(G_{n + 1 , k_{~~0 \leq k \leq maxj}})其实等于什么呢?
对于这个最终答案,我们的哈夫曼树可以是多叉的。
鉴于题目特殊性,我们看看二叉的哈夫曼树有什么特殊性质。

对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。
证明:如果最优的二叉哈夫曼树存在某个空节点,必定存在一个叶子节点的对应位置为空。那么我们可以把这个叶子节点往上移,删除这个空节点,达到更优的解法。与题设的最优性质冲突,所以对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。证毕。

此时,原问题就是哈夫曼树问题的逆问题。由于这是一个递推,所以两问题等价。

就是很隐蔽的哈夫曼树。

Summary

这题比NOI的哈夫曼树隐蔽的多了。
要对哈夫曼树的DP形式足够熟悉和敏感。
正所谓吃一堑长一智,下次不会眼瞎了。

突破点:Ai>=Ai+1A_i >= A_{i+1} ,Bi=∑nj=iBjB_i = \sum_{j = i}^{n}B_j , (x,⌈y/2⌉)(x, \lceil y/2\rceil)

PS.本校的不懂的请问富榄

【JZOJ】4210 我才不是萝莉控呢!相关推荐

  1. [哈夫曼树][堆]JZOJ 4210 我才不是萝莉控呢qaq

    Description 小Y:"小R 你是萝莉控吗."小R:"..." 为了避免这个尴尬的话题,小R 决定给小Y 做一道题. 有一个长度为n 的正整数数组A,满 ...

  2. 2019.1.21【NOIP提高组】模拟B组 JZOJ 4210 我才不是萝莉控呢

    DescribeDescribeDescribe 合并果子 SolutionSolutionSolution 题目看起来跟合并果子没有半毛钱关系,竟然是哈夫曼树.我这种菜鸡根本看不懂,打了个spfas ...

  3. [哈夫曼树] Jzoj P4210 我才不是萝莉控呢

    Description 小Y:"小R 你是萝莉控吗."小R:"..." 为了避免这个尴尬的话题,小R 决定给小Y 做一道题. 有一个长度为n 的正整数数组A,满 ...

  4. jzoj4210. 我才不是萝莉控呢(B组——Day4)

    jzoj4210. 我才不是萝莉控呢(B组--Day4) 题目 Description 小Y:"小R 你是萝莉控吗."小R:"-" 为了避免这个尴尬的话题,小R ...

  5. JZOJ 4210. 【五校联考1day1】我才不是萝莉控呢

    .. 题目: 分析: 代码: 题目: 传送门 分析: 我们直接放上合并果子的代码,然后怒切...... 好吧,其实是我找不到证明tatata是哈夫曼树的过程,但题解说是合并果子,所以就^ _ ^ 代码 ...

  6. JZOJ Day4 B组 T3【五校联考1day1】我才不是萝莉控呢

    题目大意: 小YYY:"小RRR 你是萝莉控吗."小RRR:"-" 为了避免这个尴尬的话题,小RRR 决定给小YYY 做一道题. 有一个长度为nnn 的正整数数 ...

  7. 【五校联考1day1】我才不是萝莉控呢

    Description 小Y:"小R 你是萝莉控吗."小R:"-" 为了避免这个尴尬的话题,小R 决定给小Y 做一道题. 有一个长度为n 的正整数数组A,满足A ...

  8. Jzoj4210 我才不是萝莉控呢

    小Y:"小R你是萝莉控吗."小R:"..."  为了避免这个尴尬的话题,小R决定给小Y做一道题. 有一个长度为n的正整数数组A,满足艾> =艾+ 1,现在 ...

  9. [jzoj4210] 【五校联考1day1】我才不是萝莉控呢 {哈夫曼树}

    题目 Description 小Y:"小R 你是萝莉控吗."小R:"-" 为了避免这个尴尬的话题,小R 决定给小Y 做一道题. 有一个长度为n 的正整数数组A, ...

最新文章

  1. 【驱动】uboot环境变量分析
  2. 未来哲学的六个问题域
  3. 文件操作中file.seek()方法
  4. 新编C语言程序设计入门,新编C语言程序设计教程(本科)第3篇.pdf
  5. windows常用服务命令
  6. pl sql 连接mysql_PL/SQL 连接mysql步骤
  7. 使用vagrant因用户权限导致文件不可写问题的解决
  8. 财务报表开发实例分析:几个通用维度介绍与关键点
  9. ubuntu workbench
  10. C语言回调函数callback
  11. 理解storm的ACKER机制原理
  12. 搜索总结c++ 内存泄露问题
  13. celerra(八)--Celerra Replication(下)
  14. ai人工智能_AI如何帮助截肢者?
  15. 虚幻四如何实现第一人称_虚幻周报20200616 | 开分群啦~
  16. 互不相识的人在什么情况下会给你点赞呢?
  17. Unity 粒子特效相对位置和大小的调整
  18. 10分钟带你彻底搞懂企业服务总线
  19. Arduino下的marlin固件配置基础
  20. 中职学校计算机技能大赛总结,中职学校技能大赛总结

热门文章

  1. 云服务器使用感受迥漣稅蒟羺怸遯潲佧罧障煓茹棚億辖嗔徟嚼囙
  2. matlab时域计算频率,基于MATLAB 的信号时域采样及频率混叠现象分析
  3. LoCCS专访:后量子密码技术让Hcash走得更远
  4. 大学物理 复习指导、公式推导精简过程、结论归纳 第八章 热力学基础
  5. [VB.NET源码]1-你好程序
  6. 利用linux BT5来破解无线 破解无线
  7. linux amd显卡使用情况查看
  8. PTA谁是赢家(思路简单)
  9. 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
  10. 阿里云语音电话的sdk的调用实例