一尘不染

动态编程问题

algorithm

谁能帮我找到解决此问题的最佳动态编程算法

在晚餐的途中,CCC竞争者正在排队寻找美味的卷曲薯条。N(1≤N≤100)名参赛者已经排成一排进入自助餐厅。

运行CCC的V医生在最后一刻意识到,程序员只是讨厌站在使用其他语言的程序员旁边排队。值得庆幸的是,CCC仅允许两种语言:Gnold和Helpfile。此外,参赛者决定只有在参加人数至少为K(1≤K≤6)的参赛者中时,他们才可以进入自助餐厅。

V医生决定重复以下方案:

* He will find a group of K or more competitors who use the same language standing next to each other in line and send them to dinner.
* The remaining competitors will close the gap, potentially putting similar-language competitors together.

因此,V博士为您记录了竞争对手的顺序。所有的竞争对手都可以用餐吗?如果是这样,参加晚宴的最少一组竞争对手是多少?输入项

第一行包含两个整数N和K。第二行包含N个字符,它们是该行中竞争者的顺序(H代表帮助文件,G代表Gnold)输出

在一行上输出单个数字,该数字是组成晚餐的最小组数。如果不是所有程序员都可以用餐,则输出-1。


阅读 165

收藏
2020-07-28

共1个答案

一尘不染

我不想为您实际解决SPOJ问题,因此将以下内容作为多时DP的存在证明。

对于固定的K,可以使用的字符串集不受上下文限制。我将使用gh而不是GH。例如,对于K = 3,一个语法看起来像

S -> ε | g S g S g S G | h S h S h S H

G -> ε | g S G

H -> ε | h S H

这个想法是,要么没有食客,要么第一个食客的用餐者中至少有K-1个,其中任意两个(以及最后一个和最后一个)之间都有一个可以用餐的绳子。

现在,使用CYK的加权变量来找到最小权重解析,其中非空S产生的权重为1,所有其他产生的权重为0。对于固定的K,CYK的运行时间为O(N
3)。

2020-07-28