zoukankan      html  css  js  c++  java
  • FZU 2254 英语考试

    在过三个礼拜,YellowStar有一场专业英语考试,因此它必须着手开始复习。

    这天,YellowStar准备了n个需要背的单词,每个单词的长度均为m。

    YellowSatr准备采用联想记忆法来背诵这n个单词:

    1、如果YellowStar凭空背下一个新词T,需要消耗单词长度m的精力

    2、如果YellowSatr之前已经背诵了一些单词,它可以选择其中一个单词Si,然后通过联想记忆的方法去背诵新词T,需要消耗的精力为hamming(Si, T) * w。

    hamming(Si, T)指的是字符串Si与T的汉明距离,它表示两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

    由于YellowStar还有大量繁重的行政工作,因此它想消耗最少的精力背诵下这n个单词,请问它最少需要消耗多少精力。

    Input

    包含多组测试数据。

    第一行为n, m, w。

    接下来n个字符串,每个字符串长度为m,每个单词均为小写字母'a'-'z'组成。

    1≤n≤1000

    1≤m, w≤10

    Output

    输出一个值表示答案。

    Sample Input

    3 4 2
    abch
    abcd
    efgh

    Sample Output

    10

    Hint

    最优方案是:先凭空记下abcd和efgh消耗精力8,在通过abcd联想记忆去背诵abch,汉明距离为1,消耗为1 * w = 2,总消耗为10。

    分析 

    把每个字符串看成结点,把两个结点间的边权定义为min(hamming*w,m),这样就构造出了各个字符串间的关系带权图,利用这个图求出最小生成树的权值,注意,还需要加个m,因为第一个单词一定是直接背下来的。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include <queue>
    #include <vector>
    #include<bitset>
    #include<map>
    using namespace std;
    typedef long long LL;
    const int maxn = 1e5+5;
    const int mod = 772002+233;
    typedef pair<int,int> pii;
    #define X first
    #define Y second
    #define pb push_back
    #define mp make_pair
    #define ms(a,b) memset(a,b,sizeof(a))
    const int inf = 0x3f3f3f3f;
    #define lson l,m,2*rt
    #define rson m+1,r,2*rt+1
    char s[1010][15];
    int cost[1010][1010];
    bool vis[1010];
    int lowc[1010];
    
    int Prim(int n){
        int ans=0;
        ms(vis,false);
        vis[0]=true;
        for(int i=1;i<n;i++){
            lowc[i]=cost[0][i];
        }
        for(int i=1;i<n;i++){
            int minc=inf;
            int p=-1;
            for(int j=0;j<n;j++){
                if(!vis[j]&&minc>lowc[j]){
                    minc=lowc[j];
                    p=j;
                }
            }
            if(minc==inf) return -1;
            ans+=minc;
            vis[p]=true;
            for(int j=0;j<n;j++){
                if(!vis[j] && lowc[j]>cost[p][j]){
                    lowc[j]=cost[p][j];
                }
            }
        }
        return ans;
    }
    int hamming(char a[],char b[]){
        int ans=0;
        int len=strlen(a);
        for(int i=0;i<len;i++){
            if(a[i]!=b[i]) ans++;
        }
        return ans;
    }
    int main(){
    //    freopen("in.txt","r",stdin);
        int n,m,w;
        while(~scanf("%d%d%d",&n,&m,&w)){
            for(int i=0;i<n;i++){
                scanf("%s",s[i]);
            }
            for(int i=0;i<n;i++){
                cost[i][i]=inf;
                for(int j=i+1;j<n;j++){
                    cost[i][j]=cost[j][i]=min(w*hamming(s[i],s[j]),m);
                }
            }
            int ans=Prim(n)+m;
            cout<<ans<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    ubuntu中source insight打不开,报错pagefault的解决方法
    第六次团队作业——Alpha冲刺之事后诸葛亮
    Alpha阶段总结
    第五次团队作业——第一次项目冲刺——Alpha版本
    第四次团队作业——系统设计
    团队项目——需求规格说明书
    第二次团队作业——预则立&&他山之石
    团队项目时间规划2016
    第二次结对编程作业——毕设导师智能匹配
    第二次团队作业——团队选题报告
  • 原文地址:https://www.cnblogs.com/fht-litost/p/8595318.html
Copyright © 2011-2022 走看看