霍夫曼树之切割木板最小总代价问题

来源:互联网 发布:淘宝店提前收款 编辑:程序博客网 时间:2024/05/17 07:28

                                                        

对于本题的切割方案,在给出了最终的切割结果后,我们其实可以使用倒推的方法,将最终的小木板不断合成大木板,大木板的长度就是本次合并的开销,和相同条件下的切割的开销是一样的。

这样想的话,想要总开销小的话,其实想想的话,就可以知道,肯定是不断先合并最小的.因为比如一个小木块a合并成大木块b之后大木块b又和别的木块合并成大木块c,那么大木块中的开销其实包含了原先小木块a的两倍长度,并且大木块c继续合并的话,之后合并的木块会包含越来越大倍数的小木板a的长度.

根据这种想法,我们就不断取小木板中最小的两块进行合并,并将合并的大木板放入到其他剩余的小木板中继续取最小的两块进行合并.

源代码如下:

#include<iostream>#include<algorithm>using namespace std;#define Max_N 20000int a[Max_N];int n;int solve1(){int count=n;int ans=0;while(count>1){//cout<<count<<endl;   sort(a+n-count,a+n);    //对当前剩余的木板进行升序排序   int min1=a[n-count];   int min2=a[n-count+1];      int sum=min1+min2;      /* 测试使用    for(int i=0;i<n;i++)   {   cout<<a[i]<<" ";   }   cout<<"--------";   cout<<min1<<" "<<min2<<" "<<sum<<endl;*/   ans+=sum;   a[n-count+1]=sum;   count--;}return ans;}int solve2(){int ans=0;while(n>1){   int min1=0,min2=1;   if(a[min1]>a[min2]) swap(min1,min2);      for(int i=2;i<n;i++)   {   if(a[i]<a[min1])   {   min2=min1;   min1=i;   }   else if(a[i]<a[min2])   {   min2=i;   }   }      int sum=a[min1]+a[min2];   ans+=sum;      if(min1==n-1) swap(min1,min2);   a[min1]=sum;   a[min2]=a[n-1];   n--;}return ans;}int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i];}cout<<solve2()<<endl;return 0;}
solve1函数是我在书上给出的solve2方法的基础上优化的,优化的方面除了代码更加简洁外,此外其复杂度只有O(nlogn),而原先的solve2方法复杂度则有O(n^2).

其实接触过霍夫曼树的同学到这里就可以感觉到本题其实就是个类似于霍夫曼编码的问题。在霍夫曼树中,叶子节点对应的其实就是最终分割的小木板,除了叶子节点之外的节点就是又小木板合并成的大木板。每个大木板的开销其实就是其左右子节点对应的数值之和,进一步变换就是"每个叶子节点与其所处树中深度乘积之和".这里对于霍夫曼树的代价问题就不过多阐述。


PS:现在每天看书上的题目,接触到的题目越来越多,也没太多的时间将每道题写成博客。所以我会每天写两篇博客介绍下当天遇到的个人感觉比较有价值的题目~

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办 过年不想回婆婆家过怎么办 旅行箱提手坏了怎么办 影棚人物后面有影子怎么办 微信运动图标不见了怎么办 逆光拍摄人黑了怎么办 单反镜头刮花了怎么办 股东各50股份不同意退股怎么办 退股没有协议他不愿意退钱怎么办 s7刷机有三星帐号id怎么办