HDU 1159 Common Subsequence 최장 공통 하위 시퀀스(LCS)

HDU 1159


Common Subsequence


최대 공통 하위 시퀀스(LCS)


제목 링크


HDU1159

해석하다


이것은 《알고리즘 경연의 입문에서 진급까지》의 예제인데, 표절서의 해설이 아니다.

문제 해결 코드


일반판

#include
#define ll long long
using namespace std;
const int MAXN = 6000;
const int MAXM = 6000;
char s1[MAXN];
char s2[MAXM];
int dp[MAXN][MAXM];
int n,m;
int solve()
{
	memset(dp, 0, sizeof(dp));
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (s1[i] == s2[j])
			{
				dp[i][j] = dp[i-1][j-1]+1;
			}
			else
			{
				dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
			}
		}
	}
	return dp[n][m];
}
int main()
{
	while (~scanf("%s%s", s1+1, s2+1))
	{
		n = strlen(s1+1);
		m = strlen(s2+1);
		printf("%d
"
, solve());; } return 0; }

스크롤 배열


이거 1차원으로 하면 좀 복잡한 것 같아서 2차원으로 했어요.emmm가 배로 늘어나면 공간 차이가 많지 않아서 문제가 크지 않다고 생각합니다.
#include
#define ll long long
using namespace std;
const int MAXN = 6000;
const int MAXM = 6000;
char s1[MAXN];
char s2[MAXM];
int dp[2][MAXM];
int n,m;
int solve()
{
	memset(dp, 0, sizeof(dp));
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (s1[i] == s2[j])
			{
				dp[i%2][j] = dp[(i-1)%2][j-1]+1;
			}
			else
			{
				dp[i%2][j] = max(dp[(i-1)%2][j], dp[i%2][j-1]);
			}
		}
	}
	return dp[n%2][m];
}
int main()
{
	while (~scanf("%s%s", s1+1, s2+1))
	{
		n = strlen(s1+1);
		m = strlen(s2+1);
		printf("%d
"
, solve());; } return 0; }

좋은 웹페이지 즐겨찾기