您的位置:首页 > 其它

UVa 10066 - The Twin Towers

2012-04-02 10:06 417 查看
一看就知道是lcs,10分钟敲好了代码,通过示例,一提交MLE,明白了没有保存中间结果;

再次提交,打开邮箱,一直F5,等了很长时间没反应,难道又MLE了?结果回到题目页面,发现了下面这句话:

You have to select a programming language.

。。。

再次提交WA:没有把ans[]初始化为-1;

最终花了25分钟才AC了,教训啊!

# include <stdio.h>
# include <memory.h>

int N1, N2;
int x[2];
int s1[101];
int s2[101];
int ans[101*101];

int lcs(int *x);

int main()
{
int cnt, i;

cnt = 0;
while (1)
{
scanf("%d", &N1);     scanf("%d", &N2);
if (!N1 && !N2) break;
for (i = 0; i < N1; ++i) scanf("%d", &s1[i]);
for (i = 0; i < N2; ++i) scanf("%d", &s2[i]);

x[0] = N1; x[1] = N2;
memset(ans, 0xff, sizeof(ans));

printf("Twin Towers #%d\n", ++cnt);
printf("Number of Tiles : %d\n\n", lcs(x));
}

return 0;
}

int lcs(int *x)
{
int index, ret, rem;

if (!x[0] || !x[1]) return 0;
index = x[0]-1 + (x[1]-1)*N1;
if (ans[index] >= 0) return ans[index];
if (s1[x[0]-1] == s2[x[1]-1])
{
--x[0]; --x[1];
ret = lcs(x) + 1;
++x[0]; ++x[1];
}
else
{
ret = 0;
--x[0]; if ((rem = lcs(x)) > ret) ret = rem; ++x[0];
--x[1]; if ((rem = lcs(x)) > ret) ret = rem; ++x[1];
}
ans[index] = ret;

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: