任何人都可以帮我找到这个问题的最佳动态编程算法
在去吃饭的路上,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.
Run Code Online (Sandbox Code Playgroud)
因此,V博士为您记录了竞争对手的顺序.所有竞争对手都可以用餐吗?如果是这样,竞争对手的最低数量是多少?输入
第一行包含两个整数N和K.第二行包含N个字符,它们是行中的竞争者序列(H代表帮助文件,G代表Gnold)输出
在一行上输出单个数字,它是晚餐时形成的最小组数.如果不是所有程序员都可以用餐,输出-1.
以下问题取自算法问题(问题653):
你被给予了2个数字矩阵.找到一个O(n log n)算法,该算法置换数组中的行,使得数组中的任何一列都不包含比⌈√n更长的子序列(可能不包含连续的数组元素).
我不知道如何解决这个问题.我认为它可能会使用某种分而治之的复发,但我似乎无法找到它.
有没有人有任何想法如何解决这个问题?
7.2.Oberon语法在哪里不是LL(1),也就是说,哪个是必要的多个符号的前瞻?以满足LL(1)属性的方式更改语法以下是Oberon语法:
ident = letter {letter | digit}.
integer = digit {digit}.
selector = {"." ident | "[" expression "]"}.
number = integer.
factor = ident selector | number | "(" expression ")" | "~" factor.
term = factor {("*" | "DIV" | "MOD" | "&") factor}.
SimpleExpression = ["+"|"-"] term {("+"|"-" | "OR") term}.
expression = SimpleExpression
[("=" | "#" | "<" | "<=" | ">" | ">=") SimpleExpression].
assignment = ident selector ":=" expression.
ActualParameters = "(" [expression {"," …Run Code Online (Sandbox Code Playgroud)