sdut 1225 편집 거리 (dp)

2530 단어 dp

제목 설명


문자열의 기본 동작은 한 문자를 삭제하고, 한 문자를 삽입하고, 한 문자를 다른 문자로 수정하는 세 가지입니다. 
우리는 상술한 세 가지 조작을 한 번 진행한 임의의 조작을 일차 문자의 기본 조작이라고 부른다.
다음에 우리는 두 문자열의 편집 거리를 정의한다. 두 문자열 a와 b에 대해 상술한 기본 조작을 통해 우리는 a를 b 또는 b로 a로 바꿀 수 있다. 그러면 문자열 a를 문자열 b로 바꾸는 데 필요한 최소 기본 문자 조작 단계를 문자열 a와 문자열 b의 편집 거리라고 한다.
예를 들어 a="ABC", b="CBCD"는 a와 b의 편집 거리가 2이다.
임의의 두 문자열의 편집 거리를 계산하는 빠른 프로그램을 만드는 것이 당신의 임무입니다.

입력


여러 그룹의 테스트 데이터를 포함하는 것을 입력하십시오.각 그룹의 테스트 데이터 행은 문자열 A와 문자열 B입니다.
문자열의 길이는 1024보다 크지 않고 모두 자모입니다.

출력


거리를 편집합니다.

샘플 입력

ABC CBCD

샘플 출력

2

처음에는 생각이 없었지만 가장 긴 공공 서열을 구하는 것과 약간 유사하다고 느꼈다.선배의 말을 듣고 나서야 생각이 났다.
초기화 문제 때문에 웨이를 몇 번 했어요.초기화는 0부터 시작해야 합니다.
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int dp[1100][1100];
int main()
{
	char s1[1100],s2[1100];
	while(~scanf("%s",s1))
	{
		scanf("%s",s2);
		int len1 = strlen(s1);
		int len2 = strlen(s2);

		memset(dp,0,sizeof(dp));
		for(int i = 0; i <= len2; i++)
			dp[0][i] = i;
		for(int i = 0; i <= len1; i++)
			dp[i][0] = i;

		for(int i = 1; i <= len1; i++)
		{
			for(int j = 1; j <= len2; j++)
			{
				if(s1[i-1] == s2[j-1])
					dp[i][j] = dp[i-1][j-1];
				else //i j    ,     ,    ,         ,       
					dp[i][j] = min(dp[i-1][j-1]+1, min(dp[i][j-1]+1,dp[i-1][j]+1));
			}
		}
		printf("%d
",dp[len1][len2]); } return 0; }

좋은 웹페이지 즐겨찾기