回 帖 发 新 帖 刷新版面

主题:第41次编程比赛主打题结果


kirby1985 同学的程序不能通过编译,希望下次提交代码前先在自己的机器上运行起来

第一轮, 测试数据用的是题目中给出的数据
str1 =  "abcdefg"
str2 =  "xadzfcy"

有下面三位同学给出了错误答案,其他人都安全通过
boxertony     1
hotzenplotz   2
孤独的猫      1


后面几轮的测试数据用下面的程序生成, rickone同学的建议和我得想法基本一致
通过改变两个参数SEED和LENGTH来控制生成不同的测试数据
char* str1;
char* str2;
#define LENGTH 29999
#define SEED   4

void genString(char* p, int len)
{
    for (int i=0; i<len; i++)
        p[i] = (rand() % 26) + 'a';
    p[len] = 0;
}

void Init(void)
{
    srand(SEED);

    str1 = new char[LENGTH+1];
    str2 = new char[LENGTH+1];

    genString(str1, LENGTH);
    genString(str2, LENGTH);
}

第二轮
seed=0; length=10, 正确答案应该是1
下面同学的程序给出错误答案, 其他所有同学顺利过关
WinWing             2
qantas18             5
sllone        2
其中WinWing错的有点可惜,数组下标差了1个位置,希望下次比赛能给自己多设计一些测试用例,这样的错误不难发现

第三轮
seed=1; length=100, 正确答案是28
下面三个程序倒在了这一轮
magicalking    2
willzhanglala(1)    32
willzhanglala(1)    32
现在剩下的就只剩下rickon和argentmoon两位同学了

第四轮,两个程序都给出正确答案,但是rickon稍快
seed=2; length=10000
rickone        1.60
argentmoon    1.75

第五轮,继续正确, rickone的速度优势更明显一些
seed=3; length=20000
rickone        6.2
argentmoon    7.0

第六轮,基本重复前两轮的结果
seed=4; length=29999
rickone        14.0
argentmoon    15.6

看到这里相信大多数人都和我一样,觉得冠军已经毫无悬念,
但是我还有最后一组数据
str1 = "\0"; str2 = "\0"
rickone        -842150656
argentmoon    0

很惊讶吧, rickone犯了一个很低级的错误
    memset(b,0,n+1);
应该是 memset(b, 0, (n+1)*sizeof(int));

本来这组数据我是想用来测第一轮的,但是担心杀伤力太大,想想还是留到后面吧,在测这组数据之前,我还担心可能会做无用功的,没想到就是它决定了最后的冠军归属

现在我宣布第41次编程比赛的冠军是argentmoon同学!!!

这次比赛的参赛同学不是很多,正确率也不高,可能是我给的时间不大好,下次我一定会改进
这道题目只要能识别出动态规划,实现起来非常简单,代码量也很小,如果没能看出来是动态规划,作起来就比较困难了. 

这次我给了大家一个相互challenge的机会,但是没有人有效的利用,非常可惜.argentmoon应该能从中学到一些, 万一我没有想到最后那一组数据,比赛结果就完全不同了.

口水题的结果我明天再公布

回复列表 (共19个回复)

11 楼

一般是周五中午12点至周日中午12点。
具体可以由出题者自己稍做改动。可以看看以前的同志是怎么做的。
呵呵~~

12 楼

我很弱的问一句~~~
什么是最长公共子串~~~

比如第一组数据
str1 =  "abcdefg"
str2 =  "xadzfcy"

它们的最长子串长度难道不是1?

有哪个子串超过1了?

我认为最长公共子串是:
如programfan.club.com
与club.programfandsfd

它们最长公共子串是programfan,长度是7,是这样的吗?~~~

13 楼

这个子串是可以不连续的..

14 楼

...................

15 楼


按顺序的!

16 楼

[quote]这个子串是可以不连续的..[/quote]
我以为这儿叫子序列更合适些。在学数据结构的时候,子串指的就是另一个串中的连续的子序列。

to rickone:
我在网上搜到一片文章,它的时间代价是O(p(m-p)),其中p是公共子序列的长度,m是第一个串的长度。它比直接的O(m*n)效率要高些。我看了一下,算法没有问题,可是他给出的函数计算结果不正确,我根据他的算法改了半天,也没有确定结果是否完全正确。

17 楼

http://www.ics.uci.edu/~eppstein/161/960229.html

The current (theoretically) fastest algorithm for longest common subsequences (due to myself and co-authors) runs in time O(n log s + c log log min(c,mn/c)) where c is the number of these corners, and s is the number of characters appearing in the two strings.

18 楼

2 BigCarrot:
  有标程吗?

19 楼

恭喜argentmoon获得冠军!*-_-*

我来回复

您尚未登录,请登录后再回复。点此登录或注册