[POJ1784]Huffman's Greed
题面在这里
题意
给出一棵\(n\)个节点的二叉查找树的中序遍历中每个节点的访问次数\(p[i]\),和相邻两节点\(i\)和\(i+1\)的访问次数\(q[i]\),构造一棵二叉查找树使得\(\sum_{i=1}^{n}d[i](s[i]+1)+\sum_{i=0}^{n}(max(d[i],d[i+1])+1)[即查询两者之间值的实际比较次数]\times(q[i])\)最小,输出这个最小值
数据范围
\]
sol
利用树的递归定义,设\(f[i][j]\)表示\([l,r]\)内节点合并为一棵树的时候的答案,再根据叶子情况进行讨论,可以得到\(O(Tn^3)\)的DP,其中主要部分是
\]
(这里定义\(f[i][i-1]=f[j+1][j]=0\))
可以看到转移方程实际和\(p,q\)无关(其实这明摆着就是最优排序二叉树问题)
而这样做是会T的,然而其实上面的转移式和石子合并的转移式比较类似,于是可以通过类似的方法得出其也满足\(s[i][j-1]\le s[i][j]\le s[i+1][j]\)的性质,于是就可以AC了
代码
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define RG register
using namespace std;
typedef long long ll;
const int N=405;
ll n,p[N],q[N],f[N][N],s[N][N];
int main()
{
while(scanf("%lld",&n)==1){
if(!n)break;
for(RG int i=1;i<=n;i++)scanf("%lld",&p[i]),p[i]+=p[i-1];
for(RG int i=0;i<=n;i++)scanf("%lld",&q[i]),q[i]+=q[i-1];
memset(f,63,sizeof(f));
for(RG int i=1;i<=n;i++){
f[i][i]=q[i]+p[i]-p[i-1];
s[i][i]=i;
if(i>=2)f[i][i]-=q[i-2];
}
for(RG int i=1;i<=n+1;i++)f[i][i-1]=0;
for(RG int l=2;l<=n;l++)
for(RG int i=1;l+i-1<=n;i++)
for(RG int k=s[i][i+l-2];k<=s[i+1][i+l-1];k++)
if(i>=2){
f[i][l+i-1]=min(f[i][l+i-1],f[i][k-1]+f[k+1][l+i-1]+p[l+i-1]-p[i-1]+q[l+i-1]-q[i-2]);
if(f[i][l+i-1]==f[i][k-1]+f[k+1][l+i-1]+p[l+i-1]-p[i-1]+q[l+i-1]-q[i-2])s[i][l+i-1]=k;
}
else {
f[i][l+i-1]=min(f[i][l+i-1],f[i][k-1]+f[k+1][l+i-1]+p[l+i-1]-p[i-1]+q[l+i-1]);
if(f[i][l+i-1]==f[i][k-1]+f[k+1][l+i-1]+p[l+i-1]-p[i-1]+q[l+i-1])s[i][l+i-1]=k;
}
printf("%lld\n",f[1][n]);
}
return 0;
}
[POJ1784]Huffman's Greed的更多相关文章
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- 哈夫曼(huffman)树和哈夫曼编码
哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...
- (转载)哈夫曼编码(Huffman)
转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...
- [老文章搬家] 关于 Huffman 编码
按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...
- jpeg huffman coding table
亮度DC系数的取值范围及序号: 序号(size) 取值范围 0 0 1 - ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- Huffman树进行编码和译码
//编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- Huffman Tree
哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...
随机推荐
- QQ兴趣部落 大批量引流实战技巧
兴趣部落,犹如pc端贴吧,除去盔甲,几乎大同小异. 在文章<QQ运动,新楛的马桶还在香,营销人不应摒弃>中,阿力推推对稍微僻静的平台做过简述,和QQ运动一样,兴趣部落稍显“僻静”,执行到位 ...
- mysql日志管理#慢日志详解
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中 long_q ...
- python3 练习题100例 (二十九)猴子吃桃问题
题目内容: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第n天(<1<n< ...
- 【Hadoop】配置环境-伪分布式
目录 1.Linux设置静态IP地址 2.修改主机名和映射文件 3.SSH免密码配置 4.Linux系统JDK的安装和配置 5.Hadoop伪分布式配置和测试 1.Linux设置静态IP地址 1.在L ...
- R语言学习笔记(十六):构建分割点函数
选取预测概率的分割点 cutoff<- function(n,p){ pp<-1 i<-0 while (pp>=0.02) { model.predfu<-rep(&q ...
- spoj1026 favorite dice
#include <bits/stdc++.h> using namespace std; int n,t; ; double dp[N]; /* 甩一个n面的骰子,问每一面都被甩到的需要 ...
- VectorDrawable在Android中的配置
一.让Android支持VectorDrawable apply plugin: 'com.android.application' android { defaultConfig { vectorD ...
- Android应用开发中的夜间模式实现(一)
前言 在应用开发中会经常遇到要求实现夜间模式或者主题切换具体例子如下,我会先讲解第一种方法. 夜间模式 知乎 网易新闻 沪江开心词场 Pocket 主题切换 腾讯QQ 新浪微博 我今天主要是详述第一种 ...
- 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)
题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...
- JMeter接口响应数据出现乱码的三种解决方法
第一种方法: Content encoding设置为utf-8,若仍为乱码,请用方法2 图1 第二种方法: 修改bin文件夹下的jmeter.properties文件 搜索ISO,把“#sampler ...