这是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)和递归(s,i + 1,j)并将取这两个中的最大值。
我为每个可能的起始对调用了这个函数,即
输入“RRRBRRBB”。
我用输入调用函数recurse():
等等,直到涵盖所有案例。
但是我得到了WA,并且无法确定我的方法中的缺陷,为什么它无法工作。
答案 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上记录了预期的解决方案。