제목 설명
문자열 구비 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가 확인된다.
샘플 입출력
CC의
snmn
2
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 }