CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述
试题编号: 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
 /****************************************************
     Author : Coolxxx
     Copyright 2017 by Coolxxx. All rights reserved.
     BLOG : http://blog.csdn.net/u010568270
 ****************************************************/
 #include<bits/stdc++.h>
 #pragma comment(linker,"/STACK:1024000000,1024000000")
 #define abs(a) ((a)>0?(a):(-(a)))
 #define lowbit(a) (a&(-a))
 #define sqr(a) ((a)*(a))
 #define mem(a,b) memset(a,b,sizeof(a))
 #define eps (1e-8)
 #define J 10000
 #define mod 1000000007
 #define MAX 0x7f7f7f7f
 #define PI 3.14159265358979323
 #define N 2004
 using namespace std;
 typedef long long LL;
 double anss;
 LL aans;
 int cas,cass;
 int n,m,lll,ans;
 int a[N],sum[N];
 int f[N][N],pos[N][N];
 int main()
 {
     #ifndef ONLINE_JUDGE
     freopen("1.txt","r",stdin);
 //    freopen("2.txt","w",stdout);
     #endif
     int i,j,k;
     int x,y,z;
 //    for(scanf("%d",&cass);cass;cass--)
 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
 //    while(~scanf("%s",s))
     while(~scanf("%d",&n))
     {
         mem(f,0x7f);
         for(i=;i<=n;i++)
         {
             scanf("%d",&a[i]);
             f[i][i]=;
             pos[i][i]=i;
             sum[i]=sum[i-]+a[i];
         }
         for(z=;z<n;z++)
         {
             for(i=;i+z<=n;i++)
             {
                 j=i+z;
                 for(k=pos[i][j-];k<=pos[i+][j];k++)
                 {
                     if(f[i][j]>f[i][k]+f[k+][j]+sum[j]-sum[i-])
                         f[i][j]=f[i][k]+f[k+][j]+sum[j]-sum[i-],pos[i][j]=k;
                 }
             }
         }
         printf("%d\n",f[][n]);
     }
     return ;
 }
 /*
 //
 //
 */
CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】的更多相关文章
- 区间dp+四边形不等式优化
		
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...
 - hdu 3506 Monkey Party 区间dp + 四边形不等式优化
		
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
 - hdu3506 Monkey Party (区间dp+四边形不等式优化)
		
题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆.然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍 ...
 - P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]
		
P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...
 - Codevs 3002 石子归并 3(DP四边形不等式优化)
		
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
 - [51nod 1022] 石子归并v2 [dp+四边形不等式优化]
		
题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...
 - 51nod 1022 石子归并 V2 —— DP四边形不等式优化
		
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2 基准时间限制:1 秒 空间限 ...
 - 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 ...
 - HDU-2829 Lawrence (DP+四边形不等式优化)
		
题目大意:有n个敌方军火库呈直线排列,每个军火库有一个值vi,并且任意相邻的两个库之间都有通道相连.对于任意一条连起来的军火库链,它对我方的威胁可以用函数w(i,j)表示为:w(i,j)=vi*sum ...
 
随机推荐
- PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
			
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢!http://blog.csdn.net/m0_37306360/article/details/79318644简介在这个项目中,我们将使 ...
 - [Luogu] P4838 P哥破解密码
			
题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...
 - php使用命名空间时自动加载机制
			
命名空间主要为了解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突.不过并不是你定义了使用命名空间的类,就可以在任何地方随意使用了,需要在程序运行时将定义命名空间的类文 ...
 - 自动清除日期目录shell脚本
			
很多时候备份通常会使用到基于日期来创建文件夹,对于这些日期文件夹下面又有很多子文件夹,对于这些日期文件整个移除,通过find结合rm或者delete显得有些力不从心.本文提供一个简单的小脚本,可以嵌入 ...
 - Node.js中的Buffer
			
Buffer介绍 为什么要用Buffer? 在Node/ES6 出现之前,前端工程师只需要进行一些简单的额字符串或者ODM操作就可以满足业务需求了,所有对二进制数据比较陌生. 在node出现之后,前端 ...
 - LeetCode(36)Valid Sudoku
			
题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
 - html的href标签不能下载apk文件
			
解决方案: 打开Internet 服务管理器Internet 服务管理器 网站属性 HTTP头(MIME类型) 新建 扩展名:.apk 类型(MIME): application/vnd.androi ...
 - 【二维树状数组】See you~
			
https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A ...
 - Codeforces713D. Animals and Puzzle
			
$n<=1000,m<=1000$,$n*m$的01矩阵,给$t<=1000000$个询问,每次问一个矩形中最大的1正方形的边长. 先想想不考虑“一个矩形中”的限制,那记$f(i,j ...
 - 使用流的方式去进行post请求解决中文乱码问题返回xml格式
			
/** * 请求post * @Title: getHttpURLConnection * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @param u ...