寻找最大匹配Topcoder

时间:2013-01-15 11:49:03

标签: algorithm

这是Topcoder SRM 566 Div2的算法问题。

问题可以查看here

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

Penguin Pals是一项匹配制作服务,可以使用以下程序将企鹅与新朋友匹配:

  1. 每只企鹅都被问到一个问题:“你喜欢蓝色还是红色?”
  2. 所有企鹅的排列方式使它们竖立在一个等间距的圆圈上。
  3. 组织者绘制一些直线,连接一对企鹅。每只企鹅最多只能连接一只企鹅。如果两只企鹅喜欢不同的颜色,则无法连接它们。
  4. 与其他企鹅相连的每只企鹅都会沿着这条线找到他们的匹配。
  5. 上述系统的唯一问题是,如果两条线相互交叉,它允许企鹅发生碰撞。因此,采用了新的附加规则:没有两条线可以交叉。 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)和递归(s,i + 1,j)并将取这两个中的最大值。

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

    输入“RRRBRRBB”。

    我用输入调用函数recurse():

    1. s =“RRRBRRBB”i = 0 j = n-1
    2. s =“RRBRRBBR”i = 0 j = n-1(向左移动字符串,最左边的字符串现在最右边)
    3. s =“RBRRBBRR”i = 0 j = n-1(同样的操作)
    4. 等等,直到涵盖所有案例。

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

2 个答案:

答案 0 :(得分:3)

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

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”,这个特殊的套管结果(长度/ 2) - 1;

答案 1 :(得分:1)

值得一提的是,Problem Set Analysis page for SRM566上记录了预期的解决方案。