Algorithm 寻找最大匹配Topcoder

Algorithm 寻找最大匹配Topcoder,algorithm,Algorithm,这是Topcoder SRM 566 Div2的一个算法问题 这个问题可以看出来 对于没有topcoder帐户的用户,问题描述如下: Penguin Pals是一项配对服务,通过以下步骤将企鹅与新朋友配对: 每只企鹅都被问到一个问题:你喜欢蓝色还是红色? 所有企鹅的排列方式是,它们站在一个圆圈上,间隔相等。 组织者画了一些直线,将几对企鹅连接起来。每只企鹅最多只能与另一只企鹅连接。如果两只企鹅喜欢不同的颜色,它们就无法连接。 每只与其他企鹅有联系的企鹅都会沿着这条线寻找匹配的企鹅。 上述系统唯一

这是Topcoder SRM 566 Div2的一个算法问题

这个问题可以看出来

对于没有topcoder帐户的用户,问题描述如下:

Penguin Pals是一项配对服务,通过以下步骤将企鹅与新朋友配对:

每只企鹅都被问到一个问题:你喜欢蓝色还是红色? 所有企鹅的排列方式是,它们站在一个圆圈上,间隔相等。 组织者画了一些直线,将几对企鹅连接起来。每只企鹅最多只能与另一只企鹅连接。如果两只企鹅喜欢不同的颜色,它们就无法连接。 每只与其他企鹅有联系的企鹅都会沿着这条线寻找匹配的企鹅。 上述系统唯一的问题是,如果两条线相互交叉,企鹅就会相撞。因此,通过了一项新的补充规则:两条线不得交叉。企鹅伙伴现在有一些企鹅在上面步骤2之后被安排在一个圆圈里。他们需要知道他们能创造的企鹅对的最大数量

将为您提供一个字符串颜色,其第i个字符表示圆形排列中基于第i个企鹅0的索引的首选颜色。如果第i只企鹅喜欢红色,则第i个字符为“R”,如果第i只企鹅喜欢蓝色,则第i个字符为“B”。返回可以形成的最大匹配对数

例如:

RRBRBB

报税表:3

BBBBB

收益:2

RRRBRBRBRB

报税表:5

我的做法:

调用长度为n的字符串s。请注意,第0个索引和第n-1个索引是连续的

我使用递归函数递归s,inti,intj 详情如下:

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调用函数,如果不取这两种可能性,则调用函数递归,I,j-1和递归,I+1,j并取这两个函数的最大值

我为每个可能的起始对调用了这个函数

用于输入RRRBRRBB

我调用了带有输入的递归函数:

s=RRRBRRBB i=0 j=n-1 s=RRBRRBBR i=0 j=n-1将字符串向左移动,较早的最左侧现在是最右侧 s=RBRRBBRR i=0 j=n-1相同的操作 等等,直到所有的案例都包括在内


但是我得到了WA,并且无法确定我的方法中的缺陷,为什么它不能工作。

要纠正您的解决方案,您应该在每个递归调用中执行以下操作:

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.
但我觉得这件事很棘手

解决方案: 这是一个简单的问题

1从字符串中移除所有对,其中s[i]==s[i+1%n],并计算计数。i从0到n-1


2迭代1,直到您的管柱未转换为RBRB…RB或BRBRBRBRBR…BR,对于此特殊套管结果长度/2-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.
但我觉得这件事很棘手

解决方案: 这是一个简单的问题

1从字符串中移除所有对,其中s[i]==s[i+1%n],并计算计数。i从0到n-1


2迭代1,直到您的管柱未转换为RBRB…RB或BRBRBRBRBR…BR,对于此特殊套管结果长度/2-1

可能值得一提的是,预期的解决方案记录在上。

可能值得一提的是,预期的解决方案记录在上。

您的解决方案未能进入以下测试用例RRBB@titббббб?如何失败,我的解决方案返回2,我认为答案也是2。此外,我不怀疑系统判断,我知道我的解决方案不正确,但无法识别逻辑缺陷。这就是我来这里的目的。你的解决方案返回1。第一次分支后,解决方案搜索答案RRB和RBB,同时搜索答案1和最大值1,结果1。@我想您还没有完全理解我的解决方案,我为RRBB调用递归函数,然后为RBBR、BBRR和BRRB调用递归函数,并取所有这些值中的最大值。因此,对于输入RBBR,我的解决方案输出2。您提供的代码返回1,并执行另一个与您描述的不同的操作。您的解决方案未能执行以下测试用例RRBB@titбббб。如何失败,我的解决方案返回2,我认为答案也是2。此外,我不怀疑系统判断,我知道我的解决方案不正确,但无法识别逻辑缺陷。这就是我来这里的目的。你的解决方案返回1。第一次分支后,解决方案搜索答案RRB和RBB,同时搜索答案1和最大值1,结果1。@我想您还没有完全理解我的解决方案,我为RRBB调用递归函数,然后为RBBR、BBRR和BRRB调用递归函数,并取所有这些值中的最大值。因此,对于输入RBBR,我的解决方案输出2。您提供的代码返回1,并执行您描述的其他操作。