HDU 1159 Common Subsequence DP 又一道水题

时间:2022-12-18 13:25:28

这题在做一遍的确是有了点收获。

这一次没有参考别人代码。自己写的, 不过不完全, 第一次交WA了。

第二次才A掉。

状态方程:如果str1[i] == str2[j]      则dp[i][j] = dp[i-1][j-1] + 1

    如果str1[i] !=  str2[j]      则dp[i][j] = max(dp[i-1][j], dp[i][j-1])

HDU 1159 Common Subsequence DP 又一道水题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dp[1000][1000];
int max1 (int a, int b)
{
	return a > b ? a : b;
}
int main()
{
	int i, j, m, n;
	char str1[1000], str2[1000];
	while (scanf("%s %s", str1, str2) != EOF)
	{
		memset(dp, 0, sizeof(dp));
		m = strlen(str1);
		n = strlen(str2);
		for (i = 1; i <= m; i++)
			for (j = 1; j <= n; j++)
			{
				//比较串1 与 串2字符是否相等
				//比较前一字符 so, i, j 初始化为1
				//dp[i][j] 记录的是str1的i-1个字符状态和str2的j-1个字符状态
				if (str1[i-1] == str2[j-1])
					dp[i][j] = dp[i-1][j-1] + 1;
				else
					dp[i][j] = max1(dp[i-1][j], dp[i][j-1]);
				//printf("i = %d j = %d dp[i][j] = %d\n", i, j, dp[i][j]);
			}
		printf("%d\n", dp[m][n]);
	}
	return 0;
}
//不完全是自己写的。