Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2012, 02:27   #1
J-Max
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 52
По умолчанию Почти решил задачу(она почему иногда неправильно считает)

Какая то загвоздка в коде есть, которая не дает правильно работать алгоритму, либо я неправильно понял задачу и все считается верно, т.к. делал строго по формуле.

Задача: Даны две строки А и В, длины которых равны n и m. A преобразуется в B. Удаление символа из строки стоит x баллов. Вставка символа в строку – y баллов. Замена символа в строке на любой другой символ – z баллов. Определите минимальный суммарный штраф, с которым можно преобразовать строку A в строку B.

В инете нашел описание как делать задачу. Вот оно:
Цитата:
Через F(x,y) обозначим функцию, значение которой F(i,j) равно минимальному штрафу, с которым первые i символов строки А могут быть преобразованы в начальные j символов строки В. Для решения задачи нам необходимо вычислить значение F(m,n).
Очевидно, что F(0,j)=j*y, т.к. необходимо вставить j символов в строку длины 0, чтобы получить строку длины j, а F(i,0)=i*x, т.к. необходимо удалить i символов из строки длины i, чтобы получить строку длины 0. В случае i>0 и j>0 можно записать следующие соотношения.
Если i-тый символ строки А равен j - му символу строки В, т.е. Ai=Bj, то достаточно преобразовать первые (i-1) символов строки А в первые (j-1) символов строки В, а значит F(i,j)=F(i-1,j-1).
Если i-тый символ строки А не равен j-му символу строки В, т.е. Ai≠Bj, то имеются три возможности.
1. Преобразовываем с минимальным штрафом (i-1) символов строки А в (j-1) символов строки В, а символ Аi заменяем символов Вj. В этом случае
F(i,j)=F(i-1,j-1)+z.
2. Удаляем символ Аi, а затем преобразовываем с минимальным штрафом первые (i-1) символов строки А в первые j символов строки В. В этом случае
F(i,j)=F(i-1,j)+y.
3. Добавляем символ Вj в строку А после символа Ai, а затем преобразовываем с минимальным штрафом первые i символов строки А впервые (j-1) символ строки В. В этом случае
F(i,j)=F(i-1,j)+x.
Понятно, что из этих возможностей необходимо выбрать лучшую, т.е.
F(i,j)=min(F(i-1,j-1)+z,F(i-1,j)+y,F(i-1,j)+x).
Поэтому алгоритм состоит в последовательном вычислении значений функции F(i,j) для i от 1 до m и j от 1 до n по описанным формулам.
А это мое творение. Метод рандомного тыка (как только мог изменял код) не помог.
Код:
Program kakietozadachi3;
const
  m:integer=4;
  n:integer=4;
var 
  F:array[0..m,0..n] of integer;
  x,y,z,j,i:integer;
  A,B:String;
begin
x:=1;//удаление
y:=1;//вставка
z:=10;//изменение
A:='фафа';
B:='гага';
for i:=1 to m do
begin
  F[i,0]:=i*x;
end;
for j:=1 to n do
begin
  F[0,j]:=j*y
end;
for i:=1 to m do
begin
  for j:=1 to n do
  begin
    if (A[i]<>B[j]) then
      F[i,j]:=min(min(F[i-1,j-1]+z,F[i-1,j]+y),F[i-1,j]+x)
    else
      F[i,j]:=F[i-1,j-1];
  end;
end;

//Тут просто смотрю че произошло с массивом
for i:=0 to m do
begin
  for j:=0 to n do
  begin
    write(F[i,j],'  ');
  end;
  writeln();
end;
//Конец просмотра

{
Смотрю результат - 6, хотя по идее, 
если я правильно понял задачу, 
должно быть 4, т.е. 2 раза удалил и заменил = 4*1=4
} 
writeln(F[i,j]);
end.

Последний раз редактировалось J-Max; 10.01.2012 в 02:35.
J-Max вне форума Ответить с цитированием
Старый 10.01.2012, 11:16   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
3. Добавляем символ Вj в строку А после символа Ai, а затем преобразовываем с минимальным штрафом первые i символов строки А в первые (j-1) символ строки В. В этом случае
F(i,j)=F(i-1,j)+x.
В соответсnвии с текстовым описанием (и исходя из симметричности алгоритма) должно быть
F(i,j)=F(i,j-1)+x.
Цитата:
первые i символов
Цитата:
в первые (j-1) символ
P.S. в коде нет задания значения F[0,0]. (хотя в расчетах оно используется).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.01.2012 в 11:21.
evg_m вне форума Ответить с цитированием
Старый 10.01.2012, 16:24   #3
J-Max
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 52
По умолчанию

Хоули сщеет! Работает. спс!
J-Max вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решить одну задачу по паскалю. она вовсе не сложная, но я не пойму почему моя программа не работает =stay= Паскаль, Turbo Pascal, PascalABC.NET 1 11.12.2011 21:58
C++: почему программа считает последовательность неправильно Blondy Помощь студентам 5 24.03.2011 01:50
C++ - а почему считает неправильно! Blondy Помощь студентам 2 25.02.2011 16:30
Иногда бухгалтера предприятий неправильно заполняют баланс - вносят статью в Актив вместо Пассива Dancemachine Microsoft Office Excel 12 22.10.2010 12:49
Отличная загадка! Почти решил уже. Fellics{новичок} Свободное общение 8 18.05.2009 19:45