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];
}

 

 

posted @ 2023-03-12 23:22  头像是睿智  阅读(22)  评论(0)    收藏  举报