寻找最大匹配 Topcoder
Posted
技术标签:
【中文标题】寻找最大匹配 Topcoder【英文标题】:Finding Maximum Matching Topcoder 【发布时间】:2013-01-15 11:49:02 【问题描述】:这是来自 Topcoder SRM 566 Div2 的算法问题。
问题可以查看here。
对于那些没有 topcoder 帐户的人,问题描述如下:
Penguin Pals 是一种配对服务,可将企鹅与新朋友配对,使用以下程序:
-
每只企鹅都会被问一个问题:“你喜欢蓝色还是红色?”
所有企鹅都排成一圈,间隔相等。
组织者画了一些直线,连接了几对企鹅。每只企鹅最多只能与另一只企鹅相连。如果两只企鹅喜欢不同的颜色,它们就无法连接起来。
每只与其他企鹅有联系的企鹅都沿着这条线寻找他们的对手。
上述系统的唯一问题是,如果两条线相互交叉,企鹅就会发生碰撞。因此,通过了一条新的附加规则:两条线不得交叉。 Penguin Pals 现在有一些企鹅排列在一个圆圈上(在上述过程的第 2 步之后)。他们需要知道他们可以创建的企鹅对的最大数量。
给你一个字符串颜色,它的第 i 个字符代表圆形排列中第 i 个企鹅(从 0 开始的索引)的首选颜色。如果第 i 个企鹅喜欢红色,第 i 个字符是“R”,如果第 i 个企鹅喜欢蓝色,那么第 i 个字符是“B”。返回可以形成的最大匹配对数。
例子:
“RRBRBRBB”
返回:3
“BBBBB”
返回:2
“RRRBRBRBRBRB”
返回:5
我的方法:
调用长度为n的字符串s。 (注意第 0 和第 n-1 索引是连续的)。
我使用了递归函数recurse(string s,int i,int j) 如下:
int recurse(string s,int i,int j)
if(i>=j)
return 0;
if(s[i]==s[j])
return(1+recurse(s,i+1,j-1));
else return max(recurse(s,i,j-1),recurse(s,i+1,j));
我从 i=0 和 j=n-1 开始,因为如果它们相等,它们都是连续的,用 (i+1,j-1) 调用函数,如果不是,则同时调用函数 recurse(s,i,j-1) 和 recurse(s,i+1,j) 将取这两者中的最大值。
我为每个可能的起始对调用了这个函数,即
对于输入“RRRBRRBB”。
我用输入调用了函数 recurse():
-
s="RRRBRRBB" i=0 j=n-1
s="RRBRRBBR" i=0 j=n-1(将字符串向左移动,之前的最左边现在是最右边)
s="RBRRBBRR" i=0 j=n-1(同样的操作)
以此类推,直到涵盖所有案例。
但我得到了 WA,但无法确定我的方法中的缺陷导致它无法工作。
【问题讨论】:
您的解决方案未能遵循测试用例 RRBB @Толя 它如何失败,我的解决方案返回 2,我认为答案也是 2。此外,我并不怀疑系统判断我知道我的解决方案不正确但无法识别逻辑缺陷.这就是我来这里的目的。 您的解决方案返回 1。第一次分支后,解决方案搜索 RRB 和 RBB 的答案 1 和 max too 1,作为结果 1。 @Толя 我认为你没有完全理解我的解决方案,我为 "RRBB" 调用递归函数,然后为 "RBBR"、"BBRR" 和 "BRRB" 调用递归函数并取最大值那些价值观。因此,对于输入“RBBR”,我的解决方案输出 2。 您提供的代码返回 1 并且执行的操作与您描述的不同。 【参考方案1】:要纠正您的解决方案,您应该在每个递归调用中执行以下操作:
s="RRRBRRBB" i=0 j=n-1
s="RRBRRBBR" i=0 j=n-1 (Moved the string left and the earlier leftmost is now the rightmost)
s="RBRRBBRR" i=0 j=n-1 (the same operation)
and so on until all the cases are covered.
但我对这个案子感到 TLE。
解决方案: 这是一个简单的问题。
1) 从 s[i] == s[(i+1) % n] 的字符串中删除所有对,并计算计数。 (我从 0 到 n-1)。
2) 迭代 #1 直到您的字符串未转换为“RBRBRBRB...RB”或“BRBRBRBRBR...BR”,对于这种特殊的大小写结果 (length / 2) - 1;
【讨论】:
【参考方案2】:值得一提的是,预期的解决方案记录在Problem Set Analysis page for SRM566。
【讨论】:
以上是关于寻找最大匹配 Topcoder的主要内容,如果未能解决你的问题,请参考以下文章