csp201612-4
区间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]; }


浙公网安备 33010602011771号