问题描述: | 对于长度相同的2个字符串A和 B,其距离定义为相应位置字符距离之和。2 个非空格字符的 距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距离为一定 值k。 在一般情况下,字符串 A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符 所产生的字符串。在字符串 A 和 B 的所有长度相同的扩展中,有一对距离最小的扩展,该 距离称为字符串A和B的扩展距离。 对于给定的字符串A和B,试设计一个算法,计算其扩展距离。 | |
编程任务: | 对于给定的字符串A和B,编程计算其扩展距离。 | |
数据输入: | 由文件input.txt给出输入数据。第 1 行是字符串A;第2 行是字符串 B。第 3行是空格与其它 字符的距离定值k。 | |
结果输出: | 将计算出的字符串A和B的扩展距离输出到文件output.txt。 | |
样例: | cmc snmn 2 | 10 |
核心思想: | 类似于编辑距离,f[i,j]=min{f[i-1,j]+k,f[i,j-1]+k,f[i-1,j-1]+dist(i,j)} s1前i个字符s2前j个字符的最 短扩展距离,初始化f[i,0],f[0,j] |
var
s1,s2:ansistring;
f:array[0..6000,0..6000]of longint;
i,j,l1,l2,k:longint;
function min(a,b:longint):longint;
begin
ifa>b then exit(b);
exit(a);
end;
begin
assign(input,'p319.in');reset(input);
assign(output,'p319.out');rewrite(output);
readln(s1);
readln(s2);
readln(k);
fillchar(f,sizeof(f),100);
f[0,0]:=0;
l1:=length(s1);
l2:=length(s2);
fori:=1 to l1 do
f[i,0]:=f[i-1,0]+k;
fori:=1 to l2 do
f[0,i]:=f[0,i-1]+k;
fori:=1 to l1 do
forj:=1 to l2 do
f[i,j]:=min(min(f[i-1,j],f[i,j-1])+k,f[i-1,j-1]+abs(ord(s1[i])-ord(s2[j])));
writeln(f[l1,l2]);
close(input);close(output);
end.
题目来源:《算法设计与分析》第三章动态规划