问题描述

试题编号: 201612-4
试题名称: 压缩编码
时间限制: 3.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定一段文字,已知单词a1, a2, …, an出现的频率分别t1, t2, …, tn。可以用01串给这些单词编码,即将每个单词与一个01串对应,使得任何一个单词的编码(对应的01串)不是另一个单词编码的前缀,这种编码称为前缀码。
  使用前缀码编码一段文字是指将这段文字中的每个单词依次对应到其编码。一段文字经过前缀编码后的长度为:
  L=a1的编码长度×t1+a2的编码长度×t2+…+ an的编码长度×tn
  定义一个前缀编码为字典序编码,指对于1 ≤ i < n,ai的编码(对应的01串)的字典序在ai+1编码之前,即a1, a2, …, an的编码是按字典序升序排列的。
  例如,文字E A E C D E B C C E C B D B E中, 5个单词A、B、C、D、E出现的频率分别为1, 3, 4, 2, 5,则一种可行的编码方案是A:000, B:001, C:01, D:10, E:11,对应的编码后的01串为1100011011011001010111010011000111,对应的长度L为3×1+3×3+2×4+2×2+2×5=34。
  在这个例子中,如果使用哈夫曼(Huffman)编码,对应的编码方案是A:000, B:01, C:10, D:001, E:11,虽然最终文字编码后的总长度只有33,但是这个编码不满足字典序编码的性质,比如C的编码的字典序不在D的编码之前。
  在这个例子中,有些人可能会想的另一个字典序编码是A:000, B:001, C:010, D:011, E:1,编码后的文字长度为35。
  请找出一个字典序编码,使得文字经过编码后的长度L最小。在输出时,你只需要输出最小的长度L,而不需要输出具体的方案。在上面的例子中,最小的长度L为34。
输入格式
  输入的第一行包含一个整数n,表示单词的数量。
  第二行包含n个整数,用空格分隔,分别表示a1, a2, …, an出现的频率,即t1, t2, …, tn。请注意a1, a2, …, an具体是什么单词并不影响本题的解,所以没有输入a1, a2, …, an
输出格式
  输出一个整数,表示文字经过编码后的长度L的最小值。
样例输入
5
1 3 4 2 5
样例输出
34
样例说明
  这个样例就是问题描述中的例子。如果你得到了35,说明你算得有问题,请自行检查自己的算法而不要怀疑是样例输出写错了。
评测用例规模与约定
  对于30%的评测用例,1 ≤ n ≤ 10,1 ≤ ti ≤ 20;
  对于60%的评测用例,1 ≤ n ≤ 100,1 ≤ ti ≤ 100;
  对于100%的评测用例,1 ≤ n ≤ 1000,1 ≤ ti ≤ 10000。

题目链接:

  http://cspro.org/lead/leadbpm.do?__action=goto_iframe&path=CCF_KS_KSLX_LIST&djtype=TT&2

题目大意:

  给定N个数的出现频率,求最小编码使得总长度最小,要求是前缀码,且编码必须从小到大

题目思路:

  【区间DP+四边形不等式优化】

  设f[i][j]表示i到j的最小编码长度,当合并f[i][k]和f[k+1][j]的时候需要加上区间[i,j]里的所有频率之和。

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

  这样写的复杂度是n3的。显然过不去啊

  现在考虑优化,注意到f[i][j]取到最优的划分k[i][j]的值满足k[i][j-1]<=k[i][j]<=k[i+1][j]

  可以使用四边形不等式优化。每次循环从k[i][j-1]到k[i+1][j],时间复杂度降到n2

  

  1. /****************************************************
  2.  
  3. Author : Coolxxx
  4. Copyright 2017 by Coolxxx. All rights reserved.
  5. BLOG : http://blog.csdn.net/u010568270
  6.  
  7. ****************************************************/
  8. #include<bits/stdc++.h>
  9. #pragma comment(linker,"/STACK:1024000000,1024000000")
  10. #define abs(a) ((a)>0?(a):(-(a)))
  11. #define lowbit(a) (a&(-a))
  12. #define sqr(a) ((a)*(a))
  13. #define mem(a,b) memset(a,b,sizeof(a))
  14. #define eps (1e-8)
  15. #define J 10000
  16. #define mod 1000000007
  17. #define MAX 0x7f7f7f7f
  18. #define PI 3.14159265358979323
  19. #define N 2004
  20. using namespace std;
  21. typedef long long LL;
  22. double anss;
  23. LL aans;
  24. int cas,cass;
  25. int n,m,lll,ans;
  26. int a[N],sum[N];
  27. int f[N][N],pos[N][N];
  28. int main()
  29. {
  30. #ifndef ONLINE_JUDGE
  31. freopen("1.txt","r",stdin);
  32. // freopen("2.txt","w",stdout);
  33. #endif
  34. int i,j,k;
  35. int x,y,z;
  36. // for(scanf("%d",&cass);cass;cass--)
  37. // for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
  38. // while(~scanf("%s",s))
  39. while(~scanf("%d",&n))
  40. {
  41. mem(f,0x7f);
  42. for(i=;i<=n;i++)
  43. {
  44. scanf("%d",&a[i]);
  45. f[i][i]=;
  46. pos[i][i]=i;
  47. sum[i]=sum[i-]+a[i];
  48. }
  49. for(z=;z<n;z++)
  50. {
  51. for(i=;i+z<=n;i++)
  52. {
  53. j=i+z;
  54. for(k=pos[i][j-];k<=pos[i+][j];k++)
  55. {
  56. if(f[i][j]>f[i][k]+f[k+][j]+sum[j]-sum[i-])
  57. f[i][j]=f[i][k]+f[k+][j]+sum[j]-sum[i-],pos[i][j]=k;
  58. }
  59. }
  60. }
  61. printf("%d\n",f[][n]);
  62. }
  63. return ;
  64. }
  65. /*
  66. //
  67.  
  68. //
  69. */

CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】的更多相关文章

  1. 区间dp+四边形不等式优化

    区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...

  2. hdu 3506 Monkey Party 区间dp + 四边形不等式优化

    http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...

  3. hdu3506 Monkey Party (区间dp+四边形不等式优化)

    题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆.然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍 ...

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

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

  5. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  6. [51nod 1022] 石子归并v2 [dp+四边形不等式优化]

    题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...

  7. 51nod 1022 石子归并 V2 —— DP四边形不等式优化

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2  基准时间限制:1 秒 空间限 ...

  8. HDU 3516 DP 四边形不等式优化 Tree Construction

    设d(i, j)为连通第i个点到第j个点的树的最小长度,则有状态转移方程: d(i, j) = min{ d(i, k) + d(k + 1, j) + p[k].y - p[j].y + p[k+1 ...

  9. HDU-2829 Lawrence (DP+四边形不等式优化)

    题目大意:有n个敌方军火库呈直线排列,每个军火库有一个值vi,并且任意相邻的两个库之间都有通道相连.对于任意一条连起来的军火库链,它对我方的威胁可以用函数w(i,j)表示为:w(i,j)=vi*sum ...

随机推荐

  1. Unexpected token d in JSON at position 669 while parsing near '...ct-mode":"^6.0.2"}

    问题 在安装 babel 的时候,遇到问题 Unexpected token d in JSON at position 669 while parsing near '...ct-mode" ...

  2. 【Html,Css,JavaScript】初学总结

    网页制作 HTML 一.通用模板: <!DOCTYPE html> <html lang=”en”> <head> <meta  charset=”UTF-8 ...

  3. 常用的四种设计模式 PHP代码

    // 工厂模式 interface Iuser { public function getUserName(); } class UserFactory { static public functio ...

  4. STM32串口程序的一般配置方法

    #include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...

  5. SSH配置—Linux下实现免密码登录

    首先,假设我们有两台服务器,服务器名称分别是 master 和 slave1,我们现在需要做的就是在服务器 master 上面登录 服务器 slave1 不需要输入密码就可以登录成功,如下图所示. 下 ...

  6. Spring之HelloWorld

    [Spring是什么?] 1.Spring是一个开源框架. 2.Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB(EJB是sun的JavaEE服务器 ...

  7. 关于测试驱动的开发模式以及实战部分,建议看《Python Web开发测试驱动方法》这本书

    关于测试驱动的开发模式以及实战部分,建议看<Python Web开发测试驱动方法>这本书

  8. jQuery学习之------选择器

    a.id选择器 <div id=”test1”></div> var div1=$(“#test1”);                //同css的写法一样id选择器用#号实 ...

  9. Error connecting to database: No such file or directory

    标签:Error connecting to database: No such file or directory 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  10. [K3Cloud] QueryService使用注意事项

    QueryServlice是目前查询数据非常好用的服务,但目前在使用过程中由于使用不当产生不少问题,下面将一一解答: 1.在查询一些实体关键字段如实体主键.分录序号时,条件中的别名怎么会变来变去?   ...