龙星尘 2023-03-25 15:27 采纳率: 42.9%
浏览 29
已结题

C++算法题(字符串)

农夫约翰对更好地与奶牛同伴互动很感兴趣,所以他决定学习麋鹿语言!

Moo语言实际上与英语非常相似,但更为简约。单词只有四种类型:名词、及物动词、不及物动词和连词。每两个连续的单词必须用空格隔开。标点符号也只有两种类型:句点和逗号。当一个句点或逗号出现在一个单词后面时,它会直接出现在该单词后面,如果接下来出现另一个单词,则后面跟着一个空格。

句子需要遵循以下格式之一:

类型1:名词+不及物动词。

类型2:名词+及物动词+名词。具体来说,传递动词后面必须至少有一个名词,并且除了后面的第一个名词之外,后面的每个名词前面都必须有一个逗号。

如果在两个句子之间加一个连词,就可以把它们连接成一个复合句。由此产生的复句不能与其他句子或其他复句进一步连接。每一个句子(或复合句,如果两个句子连在一起的话)都必须以句号结束。

Farmer John有一个由N个单词、C个逗号和P个句点组成的单词库(1≤P,C≤N≤10^3)。他可能只使用单词或标点符号的次数与单词库中出现的次数一样多。帮助他输出一系列包含尽可能多的单词的句子。

每个输入文件包含该问题的T(1≤T≤100)个独立实例。

INPUT FORMAT(输入来自终端/stdin):

第一行包含T,即实例的数量。每个实例指定如下:

第一行由N、C和P三个整数组成。

以下N行将由两个字符串组成。第一个字符串是FJ可以使用的单词本身(一个至少有1个、最多10个小写字母的字符串),第二个字符串是以下任意一个:名词、及物动词、不及物动词或连词,表示单词的类型。同一个单词可能在FJ的单词库中出现不止一次,但每次出现时都会有相同的类型。

OUTPUT FORMAT(将输出打印到终端/stdout):

在第一行中,输出尽可能多的单词。

在第二行中,输出具有最大可能字数的任意句子序列。任何有效的序列都将被接受。

分级器对空格很敏感,所以请确保不要输出任何多余的空格,尤其是在每行的末尾。

样例输入:

3
1 1 1
bessie noun
10 5 4
bessie noun
taught transitive-verb
flew intransitive-verb
elsie noun
farmer noun
john noun
and conjunction
and conjunction
nhoj noun
mooed intransitive-verb
24 5 4
but conjunction
bessie noun
taught transitive-verb
flew intransitive-verb
elsie noun
farmer noun
john noun
and conjunction
and conjunction
nhoj noun
mooed intransitive-verb
bob noun
impressed transitive-verb
cow noun
impressed transitive-verb
leaped intransitive-verb
elsie noun
bella noun
buttercup noun
pushed transitive-verb
mooed intransitive-verb
envy noun
john noun
nhoj noun

样例输出:
0

9
nhoj mooed. farmer taught elsie, bessie and john flew.
23
nhoj mooed. nhoj impressed john, farmer, elsie, bessie and cow impressed bob. bella pushed elsie and buttercup flew. envy mooed but john leaped.

希望能各位帮忙解决此问题,最好给出代码和思路,谢谢!(不要超时哦1000ms)

  • 写回答

1条回答 默认 最新

  • IT_service_mesh 2023-03-25 15:44
    关注

    参考GPT和自己的思路:这道题可以使用动态规划来解决。首先,我们需要用一个 dp 数组来存储从第一个单词开始,到当前位置(包括当前位置)能够组成的最长句子长度,以及该句子最后一个单词的位置。

    具体地,对于当前位置 i,我们需要从 i - 1 开始往前走,看它之前的哪个位置 j 可以作为句子的结尾。那么,如果单词 j+1 到单词 i 构成了一个合法的句子,我们就可以把从 0 到 j 的最长句子加上这个新的句子,得到从 0 到 i 的最长句子。为了方便起见,我们可以把从 0 到 j 的最长句子存下来,这样就不用每次都从 0 到 j 重新计算了。

    在具体实现的时候,我们可以用两个数组来维护,一个是 vals 数组,表示从 0 到 i 的最长句子的单词数,另一个是 pre 数组,表示从 0 到 i 的最长句子的具体单词序列。

    同时,我们需要维护两个标记数组,分别表示当前位置是否是一个单词、分号或逗号。

    最后,我们只需要在 vals 数组中找到最大值,然后输出对应的 pre 数组即可。

    代码如下:

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月27日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题
  • ¥20 Ti毫米波雷达板同步