蓝杯四十

作者: 逍遥_9353 | 来源:发表于2018-02-05 19:57 被阅读11次

  算法训练 统计单词个数 

时间限制:1.0s  内存限制:256.0MB

     

问题描述

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

  单词在给出的一个不超过6个单词的字典中。

  要求输出最大的个数。

输入格式

  第一行有二个正整数(p,k)

  p表示字串的行数;

  k表示分为k个部分。

  接下来的p行,每行均有20个字符。

  再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)

  接下来的s行,每行均有一个单词。

输出格式

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

样例输入

1 3

thisisabookyouareaoh

4

is

a

ok

sab

样例输出

7

数据规模和约定

  长度不超过200,1<k<=40,字典中的单词数不超过6。

#include <stdio.h>

#include <string.h>

#define InfiniteMin -999999999

int p,k,s;

char str[10][21];

char word[6][16];

int flag[6];

int Cnt[201][201];

int getCnt(int a,int b)

{

    int i,j,m,count=0;

    if(Cnt[a][b]<=0)

    {

        for (i=a;i<=b;i++)

            for (j=0;j<s;j++)

                if(word[j][0]==str[i/20][i%20])

                {

                    for(m=1;word[j][m]!='\0'&&i+m<=b;m++)

                        if(word[j][m]!=str[(i+m)/20][(i+m)%20])

                            break;

                    if(word[j][m]=='\0')

                    {

                        count++;

                        break;

                    }

                }

        Cnt[a][b]=count;

    }

    return Cnt[a][b];

}

int main()

{

    int i,u,K;

    int max,temp;

    int F[201][41];

    scanf("%d%d",&p,&k);

    for(i=0;i<p;i++)

        scanf("%s",str[i]);

    scanf("%d",&s);

    for(i=0;i<s;i++)

        scanf("%s",word[i]);

    for(i=0;i<20*p;i++)

        F[i][1]=getCnt(0,i);

    for(K=2;K<=k;K++)

        for(i=k;i<p*20;i++)

        {

            max=InfiniteMin;

            for(u=K-1;u<=i-1;u++)

            {

                temp=F[u][K-1]+getCnt(u+1,i);

                max=max>temp?max:temp;

            }

            F[i][K]=max;

        }

    printf("%d",F[p*20-1][k]);

    return 0;

}

思路分析:

①定义变量:行数,部分,单词个数,字符串(二维数组),循环次数,最大的个数;

②输入行数,部分;

③for语句循环输入字符;

④输入单词个数;

⑤for语句循环输入单词;

⑥for语句调用函数(两个形参):

(1)定义变量:循环次数;

(2)根据题中所给要求进行循环判断;

(3)返回值;

⑦双重循环,三目运算判断是否为总数最大;

⑧输出最大的个数。

相关文章

  • 蓝杯四十

    算法训练 统计单词个数 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个长度不超过200...

  • 蓝杯四十三

    算法提高 字符串跳步 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 给定一个字符串,你需要...

  • 蓝杯四十四

    算法训练 确定元音字母位置 时间限制:1.0s 内存限制:512.0MB 提交此题 输入一个字符串,编写程序输...

  • 蓝杯四十六

    算法训练 最长字符串 时间限制:1.0s 内存限制:512.0MB 提交此题 求出5个字符串中最长的字符串。每...

  • 蓝杯四十七

    算法训练 筛选号码 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 有n个人围成一圈,顺序排...

  • 蓝杯四十八

    算法训练 字符串逆序 时间限制:1.0s 内存限制:512.0MB 提交此题 输入一个字符串,长度在100以内...

  • 蓝杯四十一

    算法训练 数组查找及替换 时间限制:1.0s 内存限制:512.0MB 问题描述 给定某整数数组和某一整数b...

  • 蓝杯四十二

    算法提高 理财计划 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 银行近期推出了一款新的理...

  • 蓝杯四十五

    算法训练 新生舞会 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 新生舞会开始了。n名新生...

  • 蓝杯二十

    /*数的读法 问题描述Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万...

网友评论

    本文标题:蓝杯四十

    本文链接:https://www.haomeiwen.com/subject/uhiizxtx.html