谁能帮我找到解决此问题的最佳动态编程算法
在晚餐的途中,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。
我不想为您实际解决SPOJ问题,因此将以下内容作为多时DP的存在证明。
对于固定的K,可以使用的字符串集不受上下文限制。我将使用g和h而不是G和H。例如,对于K = 3,一个语法看起来像
g
h
G
H
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)。