문자열 거리

제목 설명

문자열 구비 X, 우리는 임의의 새로운 캐릭터를 삽입 및 문자열 X와 같은 문자열의 확장으로 중간 구성 X (X)의 머리와 꼬리 공간 복수 "abcbcd"인 호출 문자열 "ABCB의 □의 CD" "□ □ bcbcd □"와 "ABCB □ CD를 □"확장 된 문자열이 "□"는 공백 문자를 나타내는 X입니다.

확장 된 문자열은 문자열 A1이 인 경우, B1은 문자열의 B의 확장이며, A1 및 B1은, 다음 I 만져서 거리 A1가 동일한 길이를 가지며 B1의 각 위치의 거리의 합에 문자열을 정의하고 두 그들의 ASCII 코드의 차이의 절대 값으로부터 정의 비 공백 문자, 스페이스 문자 사이의 거리가 임의의 문자 다른 공지 된 거리 값 K 동안은, 스페이스 문자는 공백 문자 0이다. A1과 B1 최소 사이의 거리가이 거리가 캐릭터 A, 거리 B로서 정의 될 수 있도록 캐릭터 A, 모든 확장 된 스트링의 B는, 두 개의 동일한 길이 연장 문자열 A1, B1이 있어야 .

당신은 프로그램, 문자열 A를 작성하고, 거리 B가 계산된다.

입력 형식

제 행동 파일 입력 문자열 A, 두번째 라인 문자열 B. 소문자와 길이 이상 2000에 의해 A, B. 제 정수 K (1≤K≤100)의 동작은, 다른 캐릭터와의 거리의 공간을 나타낸다.

출력 형식

출력 파일은 단지 하나 개의 행이 문자열은 거리 A를 나타내고, 정수를 포함하고 B가 확인된다.

샘플 입출력

입력 # 1
CC의 

snmn 

2

출력 # 1
10
 
[문제 해결 방안]
이 질문에 대한, 우리는 고려

우리는 내가 전에 첫 번째 문자열 (S1)와 두 번째 위치를 알고있는 경우

최적해 문자열 (S2) 제 J 비트

그리고, 최적의 솔루션 전에 우리는 전면 S1을 계산할 난 J + 1 비트 비트 S2 경우

어떻게 할까?

우리는 두 치료 옵션을 이동하는 최초의 새로운 J + 1 자리를 넣어 분석 :

A : 제 J 공간에 대응하는 비트 + 1;

2 : 첫 번째 J i 번째 자리에 대응 + 1 비트;

그래서 우리는 I로 최적해 종래의 비트 및 제 J 비트 S2는 S1을 A [I] [J]에 의해 저장 가능

반복 식 : A [I] [J] 분 = {A [I-1] [J] + K, A [i]를 [J-1] + K, A [I-1] [J-1] + ABS ((INT) S1 [I] - (INT) S2 [J])};

【암호】

 1 #include <cstring>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include <cmath>
 5 using namespace std;
 6 char a[2005],b[2005];
 7 int i,j,k,len1,len2;
 8 int f[2005][2005];
 9 inline int min3(int a, int b, int c){
10     int t=a>b?b:a;
11     t=t>c?c:t;
12     return t;
13 }
14 int main(){
15     scanf("%s",a+1);
16     len1=strlen(a+1);
17     scanf("%s",b+1);
18     len2=strlen(b+1);
19     scanf("%d",&k);
20     for (i=1;i<=len1;i++)
21         f[i][0]=i*k;
22     for (j=1;j<=len2;j++)
23         f[0][j]=j*k;
24     for (i=1;i<=len1;i++)
25         for (j=1;j<=len2;j++)
26             f[i][j]=min3(f[i-1][j-1]+abs(a[i]-b[j]),f[i][j-1]+k,f[i-1][j]+k);
27     printf("%d\n",f[len1][len2]);
28     return 0;
29 }

 

추천

출처www.cnblogs.com/66dzb/p/11257307.html