• 2001年 统计单词个数


    统计单词个数

     
    题目描述

    给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)(管理员注:这里的不能再用指的是位置,不是字母本身。比如thisis可以算做包含2个is)。
    单词在给出的一个不超过6个单词的字典中。
    要求输出最大的个数。

    输入描述

    第一行为一个正整数(0<n<=5)表示有n组测试数据
    每组的第一行有二个正整数(p,k)
    p表示字串的行数;
    k表示分为k个部分。
    接下来的p行,每行均有20个字符。
    再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)
    接下来的s行,每行均有一个单词。

    输出描述

    每行一个整数,分别对应每组测试数据的相应结果。

     

    样例输入

    1
    1 3
    thisisabookyouareaoh
    4
    is
    a
    ok
    sab

    样例输出

    7

    数据范围及提示

    this/isabookyoua/reaoh

    #include<cstdio>
    #include<cstring>
    int n,p,k,s,ans,ma[205][205],f[205][45];
    //ma[i][j]表示文章中从i到j中所有的单词数;
    //f[i][j]表示前i个字符分成j份所包含的最大单词数;
    char z[250],zd[7][100];
    void work()
    {
        int i=0;
        while(i<strlen(z)){                  //挨个字符循环找ma[i][j];
            for(int k=1;k<=s;k++)
                if(z[i]==zd[k][0]){
                    int g=1;
                    for(int j=1;j<=strlen(zd[k])-1;j++){
                        if(zd[k][j]!=z[i+j]){g=0;break;}
                    }
                    if(g==0) continue;
                    else{
                        for(int j=0;j<=i;j++)
                         for(int p=i+strlen(zd[k])-1;p<strlen(z);p++) ma[j][p]++;
                        break;
                    }
                }
                i++;    
        }
    }
    int find(int n,int k)
    {
        if(k==1) return f[n][k]=ma[0][n];   //分成一份时返回ma[0][n];
        if(n+1==k) {
            for(int i=0;i<=n;i++){
                f[n][k]+=ma[i][i];
            }
            return f[n][k];                 //n+1个字符分成n+1份时返回累和;
        }
        int now;
        for(int i=n;i>k-1;i--){
            find(i-1,k-1);                  //不能放在下面的式子里,求大神解惑;
            now=f[i-1][k-1]+ma[i][n];       //动态转移方程f[n][k]=max(f[i-1][k-1]+ ma[i][n])(k-1<i<n)
            if(now>f[n][k]) f[n][k]=now;
        }
    }
    int main(){
        scanf("%d",&n);
        for(int l=1;l<=n;l++){
            scanf("%d%d",&p,&k);
            for(int i=1;i<=p;i++) scanf("%s",z+strlen(z));
            scanf("%d",&s);
            for(int i=1;i<=s;i++) scanf("%s",zd[i]);
            ans=0;
            work();
            find(strlen(z)-1,k);
            printf("%d
    ",f[strlen(z)-1][k]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    个人冲刺二(7)
    个人冲刺二(6)
    个人冲刺二(5)
    个人冲刺二(4)
    对称二叉树 · symmetric binary tree
    108 Convert Sorted Array to Binary Search Tree数组变成高度平衡的二叉树
    530.Minimum Absolute Difference in BST 二叉搜索树中的最小差的绝对值
    pp 集成工程师 mism师兄问一问
    17. Merge Two Binary Trees 融合二叉树
    270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点
  • 原文地址:https://www.cnblogs.com/qingang/p/5293321.html
Copyright © 2020-2023  润新知