区间DP
为了使霍夫曼编码变成字典序,只需要将挑选顺序改为每次都选择相邻的即可 每次合并都是累加合并字母频数*1,等同于霍夫曼编码的一单位长度*频数,因此计算合并所有所花销的最小代价 由此转变为区间DP问题 代码直接套模板:#include<bits/stdc++.h> using namespace std; int f[1005][2005]; int sum[1005]; int main(){ int n,t;cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&t); sum[i]=sum[i-1]+t; } memset(f,63,sizeof f); for(int i=1;i<=n;i++)f[i][i]=0; for(int len=2;len<=n;len++){ for(int i=1;i<=n-len+1;i++){ int l=i,r=i+len-1; for(int k=l;k<r;k++){ f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+sum[r]-sum[l-1]); } } } cout<<f[1][n]; }
标签:频数,int,csp201612,1005,霍夫曼,DP From: https://www.cnblogs.com/yds0823/p/17209757.html