Description

追逐影子的人,自己就是shadow。 ——荷马
Shadow 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Shadow 想通过一种编码方式使得它变得短一些。
一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 wi。Shadow 想要用 2 进制串 si 来替换第 i 种单词,使得其满足如下要求:
对于任意的 1 ≤ i, j ≤ n,i 6= j,都有:si 不是 sj 的前缀。
现在 Shadow 想要知道,如何选择 sj,才能使替换以后得到的新的《荷马史诗》代价最小。一本书的代价为cnt(0) + 2 ∗ cnt(1),其中cnt(x)串中x字符的出现次数。
一个字符串被称为二进制字符串,当且仅当它的每个字符是 0 或 1。
字符串 Str1 被称为字符串 Str2 的前缀,当且仅当:存在 1 ≤ t ≤ m,使得Str1 = Str2[1…t] 。其中,m 是字符串 Str2 的长度,Str2[1…t] 表示 Str2 的前 t个字符组成的字符串。

Input

从文件b.in中读入数据.
输入文件的第 1行包含 1 个正整数 n,表示共有 n 种单词。
接下来 1 行,包含 n 个非负整数,第i个整数代表 wi ,表示第 i 种单词的出现次数。

Output

输出到文件b.out中.
输出 1 个整数,为《荷马史诗》经过重新编码以后的最短长度。

Sample Input

Sample Input1
4
1 1 2 2

Sample Input2
6
1 1 3 3 9 9

Sample Output

Sample Output1
17

Sample Output2
81

Data Constraint

对于所有数据,保证2 ≤ n ≤ 1000, 1 ≤ wi ≤ 10^5
• 对于前15%的数据,n ≤ 15
• 对于另10%的数据,∀wi 相等
• 对于另25%的数据,n ≤ 100
• 对于另20%的数据,n ≤ 400
• 对于另10%的数据,n ≤ 750
• 对于最后20%的数据,没有特殊的约定.

分析:
可以造出一棵字典树(类似与哈夫曼树),在叶子节点上填这些数字即可。
不同的是,这棵树有儿子的权值为2,可以看作是深度为2,即在深度上跨两层。
然后把数从小到大按深度从大到小填满这棵树即可。
我们设f[i][j][a][b]f[i][j][a][b]f[i][j][a][b]表示前jjj行,前j−2j-2j−2行有iii个叶子节点,第j−1j-1j−1行有aaa个答案,第jjj行有bbb个叶子节点的答案。
把www从大到小排序,显然jjj是不用管的,因为行数没有限制。
考虑转移,显然只有两种,一种是第i−1i-1i−1行全部进行扩展,导致第iii行和第i+1i+1i+1行都多了aaa个叶子,但同时w[i+1]w[i+1]w[i+1]~w[n]w[n]w[n]都要加一层深度。
第二种是留出一个位置放w[i+1]w[i+1]w[i+1],此时i−1i-1i−1行少一个叶子。
留出多个叶子可以由第二种叠加而来,此时并不是每行都只留一个,增多一行必须有前面的转移。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define LL long longconst int maxn=1e3+7;
const LL inf=1e13;using namespace std;int n,p;
int a[maxn],sum[maxn];
LL f[2][maxn][maxn];bool cmp(int a,int b)
{return a>b;
}int main()
{freopen("b.in","r",stdin);freopen("b.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1,cmp);for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];  for (int j=0;j<=n;j++){for (int k=0;k<=n;k++) f[0][j][k]=inf;}   f[0][1][0]=0;p=0;for (int i=0;i<n;i++){for (int j=0;j<=n-i;j++){for (int k=0;k<=n-i-j;k++) f[1-p][j][k]=inf;}for (int j=0;j<=n-i;j++){for (int k=0;k<=n-i-j;k++){if (f[p][j][k]==inf) continue;if (j>0) f[p^1][j-1][k]=min(f[p^1][j-1][k],f[p][j][k]);f[p][j+k][j]=min(f[p][j+k][j],f[p][j][k]+sum[n]-sum[i]);}}p^=1;}      printf("%lld\n",f[p][0][0]);
}

jzoj 6012.【NOIP2019模拟1.25A组】荷马史诗 dp相关推荐

  1. NOI2015 Day2 T1 荷马史诗(洛谷P2168)

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

  2. [NOI 2015]荷马史诗

    Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

  3. 周末狂欢赛4(1-02E. JM的西伯利亚特快专递,寿司晚宴,荷马史诗)

    文章目录 T1:1-02E. JM的西伯利亚特快专递 题目 题解 code T2:寿司晚宴 题目 题解 code T3:荷马史诗 题目 题解 code T1:1-02E. JM的西伯利亚特快专递 题目 ...

  4. ajax荷马史诗,荷马史诗(8)

    <奥德赛>(Odyssey) 奥德修斯的希腊文原意是"麻烦":他既带给别人麻烦,自己也遭遇麻烦 <埃阿斯和卡珊德拉>(Ajax and Cassandra) ...

  5. (HYSBZ - 4198)荷马史诗

    (HYSBZ - 4198)荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1376 Solved: 725 Description 追逐影子 ...

  6. 荷马史诗【k叉哈夫曼树】

    题目描述 追逐影子的人,自己就是影子. --荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和 ...

  7. [Huffman树] aw149. 荷马史诗(哈夫曼模型+贪心)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:149. 荷马史诗 2. 题目解析 k叉哈夫曼树问题. n 个叶子节点合并成 1 个点,总共合并减少 n-1 个点,每次合并都会减少 ( ...

  8. 【Huffman树】【贪心】【NOI 2015】【bzoj 4198】荷马史诗

    4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 127 Solved: 80 Description 追逐影子的 ...

  9. 算法进阶指南:0x17:荷马史诗

    原题链接 追逐影子的人,自己就是影子. --荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和 ...

最新文章

  1. SAP FICO年结
  2. iOS之深入解析WKWebView的坑点收录和优化处理
  3. session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例
  4. spring Mvc 执行原理 及 xml注解配置说明 (六)
  5. 【快速入门ORM框架之Dapper】大牛勿进系列
  6. web前端知识(04html的表单)
  7. yum安装Apache2.4
  8. 水系图一般在哪里找得到_水系电池再发Nature,事实力证或将迎来发展的春天!...
  9. 计算机函数if公式的使用,if函数的嵌套计算公式的使用
  10. FS5175AESOP8多串锂电池同步降压充电IC
  11. 基于封锁的并发控制机制
  12. WPF流程图制作系列相关基础一
  13. 装修鸿蒙瓷砖选择,装修用全抛釉瓷砖好还是通体大理石好?两种瓷砖有什么区别?...
  14. 计算机桌面保护时间,电脑处于屏幕保护或者休眠状态的时间怎么自己设置?
  15. 开发者必备的顶级Android开发工具,成功入职阿里
  16. redis做浏览历史数据
  17. 从达沃斯世界经济论坛,看区块链和数字货币的三大发展趋势
  18. WRF-Chem emission guide
  19. linux进入vi界面后命令,教你Linux-vi编辑器的常用命令
  20. 四不帮你弄懂网络编程之最后一步

热门文章

  1. 忽尔今夏,SpringSide 3.0
  2. 《老路用得上的商学课》21-30学习笔记
  3. Word里一级标题里页眉很近
  4. 苹果这波是要偷家啊。。
  5. 微信公众号wx.getlocation
  6. @Enumerated的使用
  7. 从专家系统到知识图谱(好文)
  8. CentOS 7下的软件安装方法总结
  9. iOS 审核总被拒?如何提升 iOS 审核通过率!
  10. HTML网页内嵌入网页