uva 10405 - Longest Common Subsequence(最长公共子序列)

本文解析了一个经典的LCS(最长公共子序列)问题,该问题是UVA在线评测平台上的一个入门级DP(动态规划)题目。文章详细介绍了如何解决此问题,并分享了一些编程技巧,比如正确读取字符串的方法及避免常见错误。

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346

经典的LCS水题。。。

用来入门是极好的。也是我的第一道dp题。

但是一个非常坑的点是它的数据好像有单数组的,这意味着如果用while(gets(a))这样去做循环的话可能会出错,必须用两个串一起读入才行,这点上我被坑了几次。。。但貌似有人也用读单串去写却没有出错(见此),不知道是我判断错误还是其他问题。。。

还有一点,第一次做dp题,搞懂算法后却不知道如何读入字符串才能让数组第一位是0,最后是参考了别人代码后用gets(a+1)这种形式读入字符串,以及strlen(a+1)获取字符串长度,豁然开朗啊。

后来我又发现了其实可以正常去读入,在dp的时候对储存数组处理时下标都多+1就行了。。。


#include<cstdio>
#include<cstring>
#define MAXN 1010

char a[MAXN], b[MAXN];
int c[MAXN][MAXN];

int max(int a, int b)
{
	if (a > b)
		return a;
	return b;
}

int main()
{
	while (gets(a + 1) && gets(b + 1))
	{
		int al = strlen (a + 1), bl = strlen (b + 1);
		memset(c, 0, sizeof(c));
		for (int i = 1; i <= al; i++)
			for (int j = 1; j <= bl; j++)
				if (a[i] == b[j])
					c[i][j] = c[i - 1][j - 1] + 1;
				else
					c[i][j] = max(c[i - 1][j], c[i][j - 1]);
		printf("%d\n", c[al][bl]);
	}
	return 0;
}


转载于:https://www.cnblogs.com/java20130723/archive/2013/05/13/3212161.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值