Изменения

Перейти к: навигация, поиск

Задача о редакционном расстоянии

1813 байт убрано, 02:43, 13 января 2012
Код получения редакционного предписания
|'''h''' ||'''e''' ||'''l''' ||'''l''' ||'''o''' ||'''2''' ||'''1''' ||'''4'''
|}
 
== Код получения редакционного предписания ==
Функция '''distance''' принимает две строки '''s1''', '''s2''' и возвращает последовательность действий, необходимых для получения из первой строки второй кратчайшим образом.
 
'''a''' - цена вставки символа,
'''b''' - цена удаления символа,
'''c''' - цена замены символа
 
function distance(s1, s2: longint): string;
begin
n = length(s1);
m = length(s2);
for i = 1 to n do d[0, i] = i;
for i = 1 to m do d[i, 0] = i;
for i = 1 to n do for j = 1 to m do
if s1[i] == s2[j] then
begin
d[i, j] = d[i - 1, j - 1];
p[i, j].x = i - 1;
p[i, j].y = j - 1;
end else
begin
if (d[i - 1, j] + a <= d[i, j - 1] + b) and (d[i - 1, j] + a <= d[i - 1, j - 1] + c) then
begin
d[i, j] = d[i - 1, j] +a;
p[i, j].x = i - 1;
p[i, j].y = j;
end;
if (d[i, j - 1] + b <= d[i - 1, j] + a)and (d[i, j - 1] + b <= d[i - 1, j - 1] + c) then
begin
d[i, j] = d[i, j - 1] +b;
p[i, j].x = i;
p[i, j].y = j - 1;
end;
if (d[i - 1, j - 1] + c <= d[i, j - 1] + b) and (d[i - 1, j - 1] + c <= d[i - 1, j] + a) then
begin
d[i, j] = d[i - 1, j - 1] + c;
p[i, j].x = i - 1;
p[i, j].y = j - 1;
end;
end;
x = n;
y = m;
while (x > 0) and (y > 0) do
begin
if p[x, y].x - x == 0 then s = 'D' + s else
if p[x, y].y - y == 0 then s = 'I' + s else
if s1[x] == s2[y] then s = 'M' + s else s = 'R' + s;
x = p[x, y].x;
y = p[x, y].y;
end;
distance = s;
end;
== Литература ==
Анонимный участник

Навигация