Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Динамическое програмирование. Подпалендром.   Найти похожие ветки 

 
KilkennyCat ©   (2010-05-10 17:57) [80]


> И вообще ничего уникального в рекурсии не вижу

я имел ввиду не алгоритм, а полученные результаты. когда я начну считать рекурсию уникальной - застрелюсь :)


 
Sha ©   (2010-05-10 18:03) [81]

>> но там гораздо уникальнее решения
> полного решения там нет, только часть.

Полное решение для подстроки привел автор.

> тем более в данном случае надо без рекурсии решить

Заполнение той же матрицы, что у автора, без рекурсии приведено в [47].

> Матрица, конечно, это не совсем обычно, но по-моему тоже не обязательно так делать.

Для подстрок или подпоследовательностей, когда нужна только длина подпоследовательности, достаточно вектора.

Если нужна сама подпоследовательность, то, по-видимому, без матрицы не обойтись.
Точнее, мне решения без матрицы не попадались.


 
xayam ©   (2010-05-10 18:19) [82]


> Заполнение той же матрицы, что у автора, без рекурсии приведено
> в [47].
> Sha ©   (10.05.10 14:26) [47]
> procedure FillPalMatrix( const s: string );
> var
>  i, j, t, count, found: integer;
> begin;
>  for j:=1 to length(s) do begin;
>    Mat[j,j]:=1;
>    for i:=j-1 downto 1 do begin;
>      count:=Mat[i+1,j];
>      t:=j;
>      while s[t]<>s[i] do dec(t);
>      found:=t-i+1;
>      if t>=i+2 then found:=Mat[i+1, t-1]+2;
>      if count<found then count:=found;
>      Mat[i,j]:=count;
>      end;
>    end;
>  end;

ну я потестировал этот код без рекурсии. Для исходное строки HTEOLFEOLEH есть два решения по матрице HEOFOEH и HELFLEH, а того что в примере HELOLEH  нет. Ошибся где-то в процедуре?


 
Sha ©   (2010-05-10 18:27) [83]

> xayam ©   (10.05.10 17:28) [76]
> Мы и первоисточники читаем.
> http://.../lesson2.htm

Кошмар. Непричесанный полуфабрикат.


 
xayam ©   (2010-05-10 18:34) [84]

Вот тест для твоего кода, по матрице видно, что только два решения.

1  0  0  0  0  0  0  0  0  0  7  
0  1  0  0  0  0  0  0  0  0  0  
0  0  1  0  0  0  3  0  0  5  0  
0  0  0  1  0  0  0  3  0  0  0  
0  0  0  0  1  0  0  0  3  0  0  
0  0  0  0  0  1  0  0  0  0  0  
0  0  0  0  0  0  1  0  0  3  0  
0  0  0  0  0  0  0  1  0  0  0  
0  0  0  0  0  0  0  0  1  0  0  
0  0  0  0  0  0  0  0  0  1  0  
0  0  0  0  0  0  0  0  0  0  1



program MaxPalendrom2;
{$APPTYPE CONSOLE}
uses SysUtils;
const max = 100;
var Mat: array[1..max, 1..max] of integer;
   s: string;
   i, j, n: integer;
procedure FillPalMatrix(const s: string);
var
i, j, t, count, found: integer;
begin;
for j:= 1 to n do begin
  Mat[j, j]:= 1;
  for i:= j - 1 downto 1 do begin
    count:= Mat[i + 1, j];
    t:=j;
    while s[t] <> s[i] do dec(t);
    found:= t - i + 1;
    if t >= i + 2 then found:= Mat[i + 1, t - 1] + 2;
    if count < found then count:= found;
    Mat[i, j]:= count;
  end;
end;
end;
begin
  //readln(s);
  s:= "HTEOLFEOLEH";
  n:= length(s);
  for i:= 1 to n do
  for j:= 1 to n do
   if i = j then Mat[i, j]:=  1 else
   if i > j then Mat[i, j]:=  0 else
                 Mat[i, j]:= -1;
  FillPalMatrix( s );
  for i:= 1 to n do
  for j:= 1 to n do
  if  s[i] <> s[j] then Mat[i, j]:= 0;

  for i:= 1 to n do
  begin
        for j:= 1 to n do write( inttostr( Mat[i, j] ) + "  " );
        writeln;
  end;
  readln;
end.


 
Sha ©   (2010-05-10 18:46) [85]

Просто 1 раз в самом начале вызови FillPalMatrix(s) и все.
Больше не меняй элементы матрицы.

Не читай элементы ниже главной диагонали,
они не имеют смысла, т.к. не существует строк с отрицательной длиной.


 
xayam ©   (2010-05-10 18:51) [86]


> Sha ©   (10.05.10 18:46) [85]
> Просто 1 раз в самом начале вызови FillPalMatrix(s) и все.
> Больше не меняй элементы матрицы.

так обнулить же тоже надо, иначе там неправильно получается - не палендром, а какой-то мусор в матрице


 
Sha ©   (2010-05-10 18:52) [87]

Например, процедура автора с ипользованием FillPalMatrix(s) перепишется так:

begin;
 s:=Edit1.Text;
 FillPalMatrix(s);

 maxi:=0;
 maxj:=0;
 for j:=1 to length(s) do for i:=j downto 1 do
 if (j-i+1>maxj-maxi+1) and (j-i+1=Mat[i,j]) then begin;
   maxi:=i;
   maxj:=j;
   end;
 Memo1.Lines.Add(IntTostr(maxj-maxi+1));
 Memo1.Lines.Add(copy(s,maxi,maxj-maxi+1)); //палиндром без пропусков
 end;


 
Sha ©   (2010-05-10 18:53) [88]

> так обнулить же тоже надо

не надо


 
xayam ©   (2010-05-10 19:01) [89]

выводит:

1
H


program MaxPalendrom2;
{$APPTYPE CONSOLE}
uses SysUtils;
const max = 100;
var Mat: array[1..max, 1..max] of integer;
   s: string;
   i, j, n, maxi, maxj: integer;
   //f: TEXT;
procedure FillPalMatrix(const s: string);
var
i, j, t, count, found: integer;
begin;
for j:= 1 to n do begin
  Mat[j, j]:= 1;
  for i:= j - 1 downto 1 do begin
    count:= Mat[i + 1, j];
    t:=j;
    while s[t] <> s[i] do dec(t);
    found:= t - i + 1;
    if t >= i + 2 then found:= Mat[i + 1, t - 1] + 2;
    if count < found then count:= found;
    Mat[i, j]:= count;
  end;
end;
end;
begin
  //readln(s);
  s:= "HTEOLFEOLEH";
  n:= length(s);
  //assign(f, "C:\text.txt");
  //rewrite(f);
  for i:= 1 to n do
  for j:= 1 to n do
   if i = j then Mat[i, j]:=  1 else
   if i > j then Mat[i, j]:=  0 else
                 Mat[i, j]:= -1;
  FillPalMatrix( s );
  {for i:= 1 to n do
  for j:= 1 to n do
  if  s[i] <> s[j] then Mat[i, j]:= 0;}
  maxi:= 0;
  maxj:= 0;
  for j:= 1 to n do
  for i:= j downto 1 do
  if ( j - i + 1 > maxj - maxi + 1 ) and ( j - i + 1 = Mat[i, j] ) then begin
     maxi:= i;
     maxj:= j;
  end;
  writeln( IntTostr( maxj - maxi + 1) );
  writeln( copy(s, maxi, maxj - maxi + 1) );
  //rewrite(f);
  readln;
end.


 
Sha ©   (2010-05-10 19:08) [90]

И это правильно,
потому что пример автора ищет не подпоследовательности-палиндромы,
а подстроки-палиндромы,
т.е. в примере автора символы палиндрома-результата должны стоять рядом в исходной строке.
Подстрок-палиндромов длины больше 1 нет во введенной строке.


 
xayam ©   (2010-05-10 19:13) [91]


> Sha ©   (10.05.10 18:53) [88]
> > так обнулить же тоже надо
> не надо

это почему? Вот без обнуления к строке
1)   H
2)   T
3)   E
4)   O
5)   L
6)   F
7)   E
8)   O
9)   L
10) E
11) H

    1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11)
1)   1  1  1  1  1  1   3  3  3   5   7  
2)   0  1  1  1  1  1   3  3  3   5   5  
3)   0  0  1  1  1  1   3  3  3   5   5  
4)   0  0  0  1  1  1   1  3  3   3   3  
5)   0  0  0  0  1  1   1  1  3   3   3  
6)   0  0  0  0  0  1   1  1  1   3   3  
7)   0  0  0  0  0  0   1  1  1   3   3  
8)   0  0  0  0  0  0   0  1  1   1   1  
9)   0  0  0  0  0  0   0  0  1   1   1  
10) 0  0  0  0  0  0   0  0  0   1   1  
11) 0  0  0  0  0  0   0  0  0   0   1

очевидно, что большинство решений для получения максимального палендрома не имеют смысла, как и нули ниже главной диагонали. Не?


 
xayam ©   (2010-05-10 19:15) [92]


> потому что пример автора ищет не подпоследовательности-палиндромы,
> а подстроки-палиндромы

как раз и те и другие, два решения-подпоследовательности есть в матрице


 
xayam ©   (2010-05-10 19:17) [93]

в матрице есть решения, я про вывод не говорю


 
xayam ©   (2010-05-10 19:24) [94]

Вот сравни эти матрицы:

           обнуленная                              необнуленная
1  0  0  0  0  0  0  0  0  0  7       1  1  1  1  1  1  3  3  3  5  7
0  1  0  0  0  0  0  0  0  0  0       0  1  1  1  1  1  3  3  3  5  5
0  0  1  0  0  0  3  0  0  5  0       0  0  1  1  1  1  3  3  3  5  5
0  0  0  1  0  0  0  3  0  0  0       0  0  0  1  1  1  1  3  3  3  3
0  0  0  0  1  0  0  0  3  0  0       0  0  0  0  1  1  1  1  3  3  3
0  0  0  0  0  1  0  0  0  0  0       0  0  0  0  0  1  1  1  1  3  3
0  0  0  0  0  0  1  0  0  3  0       0  0  0  0  0  0  1  1  1  3  3
0  0  0  0  0  0  0  1  0  0  0       0  0  0  0  0  0  0  1  1  1  1
0  0  0  0  0  0  0  0  1  0  0       0  0  0  0  0  0  0  0  1  1  1
0  0  0  0  0  0  0  0  0  1  0       0  0  0  0  0  0  0  0  0  1  1
0  0  0  0  0  0  0  0  0  0  1       0  0  0  0  0  0  0  0  0  0  1


В обнуленной сразу решения видно.


 
xayam ©   (2010-05-10 19:29) [95]

о, блин я тормоз, там же три решения на каждую тройку:

1  0  0  0  0  0  0  0  0  0  7  
0  1  0  0  0  0  0  0  0  0  0  
0  0  1  0  0  0  3  0  0  5  0  
0  0  0  1  0  0  0  3  0  0  0  
0  0  0  0  1  0  0  0  3  0  0  
0  0  0  0  0  1  0  0  0  0  0  
0  0  0  0  0  0  1  0  0  3  0  
0  0  0  0  0  0  0  1  0  0  0  
0  0  0  0  0  0  0  0  1  0  0  
0  0  0  0  0  0  0  0  0  1  0  
0  0  0  0  0  0  0  0  0  0  1

так что все работает, нужно обнулять и вычленять любой результат


 
Sha ©   (2010-05-10 19:32) [96]

Для того, чтобы найти и вывести все решения обоих задач
(для подстрок-палиндромов и подпоследовательностей-палиндромов)
достаточно иметь матрицу, сформированную FillPalMatrix.

Любые последующие действия с матрицей могут привести лишь к потере
содержащихся в ней решений.


 
xayam ©   (2010-05-10 19:39) [97]


> Любые последующие действия с матрицей могут привести лишь
> к потере содержащихся в ней решений.

так не теряется же, потому что условие стоит if s[i] <> s[j] then Mat[i, j]:= 0;
в [95] - все возможные решения выделены жирным шрифтом. Чтобы вывести любой результат нужно сделать цикл в направлении от верхнего правого угла к нижнему левому постепенно уменьшая номер строки i и столбца j, тогда значение матрицы будет уменьшаться на два от начальных семи до единицы, все просто :) еще нужно учесть, что размер матрицы может быть четным числом.


 
xayam ©   (2010-05-10 19:41) [98]


> уменьшая номер строки i и столбца j

поправка: увеличивая i и уменьшая j


 
Sha ©   (2010-05-10 19:43) [99]

> xayam ©   (10.05.10 19:39) [97]

Если можно вывести решение ничего не обнуляя, нафига обнулять?
Когда калькулятор вычисляет 2х2, он же не сопровождает это музыкой и анимацией.


 
Sha ©   (2010-05-10 20:08) [100]

Для полной ясности. Мы заполняли матрицу не решениями.

Mat[i,j] содержит длину максимального палиндрома, образованного некоторыми символами подстроки s[i..j], идущими в том же порядке.
А среди них совершенно случайно оказались нужные нам в обоих задачах длины :)


 
Родион   (2010-05-10 20:35) [101]

ув. Sha и xayam что я могу показать завтра на зачете из всего, что вы перерешали? =)


 
Плохиш ©   (2010-05-10 20:47) [102]


> что я могу показать завтра на зачете из всего, что вы перерешали?

Что понял, то и показывай.


 
KilkennyCat ©   (2010-05-10 20:48) [103]


> Родион   (10.05.10 20:35) [101]

ничего. если бы понял, не спросил бы, а раз не понял, то как покажешь-то? Проще сразу коньяк.


 
Родион   (2010-05-10 21:01) [104]

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

Function F(i, j : Integer) : Integer;
var Ch : Char; R1, R2 : Integer; k : byte;
begin
if Mat[i, j] = -1 then
BEGIN
k := j;
while s[i] <> s[k] do dec(k);
R1 := F(i + 1, j);
if i <> k then R2 := F(i + 1, k - 1) + 2 else R2 := 1;
if R1 > R2 then Mat[i, j] := R1 else Mat[i, j] := R2
END;
F := Mat[i, j]
end;

не было рекурсии, чтоб она была уже в конце задачи. я говорю с ее уст. за несколько дней проведенных в этом форуме я понял фишку с матрицей состоящих из 2х масивов, но реализовать все же не могу ибо я наверно нуп, собственно и по этому обратился к вам


 
Плохиш ©   (2010-05-10 21:04) [105]


> за несколько дней проведенных в этом форуме я понял

А должен был понять, что проблемы индейцев шерифа не волнуют.


 
Родион   (2010-05-10 21:08) [106]


> А должен был понять, что проблемы индейцев шерифа не волнуют.


спасибо


 
Sha ©   (2010-05-10 21:15) [107]

> Родион   (10.05.10 21:01) [104]
> чтоб как она сказала в данной функции не было рекурсии

Перечитай ветку, текст заполнения матрицы приводился уже.
А функкция, если она тебе все еще зачем-то нужна, будет из одного оператора:

Result:=Mat[i,j];


 
Родион   (2010-05-10 21:18) [108]


> А функкция, если она тебе все еще зачем-то нужна

препод сказал ваще убирай ее или рекурсию из функции в конец программы, что то в этом роде


 
Sha ©   (2010-05-10 21:23) [109]

> ваще убирай ее

Молодец какая :)
Полностью солидарен.

> или рекурсию из функции в конец программы, что то в этом роде

Скорее всего, что-то в этом роде :)
Иначе телега впереди лошади.


 
xayam ©   (2010-05-10 21:26) [110]


> Родион   (10.05.10 21:18) [108]
> > А функкция, если она тебе все еще зачем-то нужна
> препод сказал ваще убирай ее или рекурсию из функции в конец
> программы, что то в этом роде

[84] как раз без рекурсии и все правильно заполняет, осталось только матрицу обойти и вывести результат. Хоть что-то ты должен сделать :)


 
Sha ©   (2010-05-10 21:38) [111]

> [84] как раз без рекурсии и все правильно заполняет
там много лишнего, можно обрезать

program MaxPalendrom2;
{$APPTYPE CONSOLE}
uses SysUtils;

const max = 100;
var Mat: array[1..max, 1..max] of integer;

procedure FillPalMatrix(const s: string);
var
  i, j, t, count, found: integer;
begin
  for j:= 1 to n do begin
    Mat[j, j]:= 1;
    for i:= j - 1 downto 1 do begin
      count:= Mat[i + 1, j];
      t:=j;
      while s[t] <> s[i] do dec(t);
      found:= t - i + 1;
      if t >= i + 2 then found:= Mat[i + 1, t - 1] + 2;
      if count < found then count:= found;
      Mat[i, j]:= count;
    end;
  end;
end;

var
  s: string;
begin
  readln(s);
  FillPalMatrix(s);
  //тут твои 15 строчек
end.

Всего 15 строчек написать надо.
И что характерно, за все это время ни единой попытки написать первую строчку


 
Родион   (2010-05-10 21:39) [112]

"обойти матрицу" можно тут поподробнее чуть, xayam :)


 
Родион   (2010-05-10 21:41) [113]

for j:= 1 to n do begin \ мб не n а max. или я о5 туплю(


 
xayam ©   (2010-05-10 21:49) [114]

Чтобы вывести любой результат нужно сделать цикл в направлении от верхнего правого угла к нижнему левому постепенно уменьшая номер строки i и столбца j, тогда значение матрицы будет уменьшаться на два от начальных семи до единицы


 
Sha ©   (2010-05-10 21:53) [115]

> Родион   (10.05.10 21:39) [112]
> "обойти матрицу" можно тут поподробнее чуть, xayam :)

Так он уже матрицы выводил, показывал
Нам хочется, чтоб эти 15 сточек ты сам написал.

Вот, например, если вместо них написать

 maxi:=0;
 maxj:=0;
 for j:=1 to length(s) do for i:=j downto 1 do
 if (j-i+1>maxj-maxi+1) and (j-i+1=Mat[i,j]) then begin;
   maxi:=i;
   maxj:=j;
   end;

то мы найдем, положение максимального палиндрома-строки.
Можешь это использовать в качестве примера обхода матрицы.


 
xayam ©   (2010-05-10 21:54) [116]


> Родион   (10.05.10 21:39) [112]
> "обойти матрицу" можно тут поподробнее чуть, xayam :)

[114] + [95] (жирным выделено то что тебе нужно получить в общем виде пройдя один из путей 7-3-1)


 
xayam ©   (2010-05-10 21:57) [117]

7-5-33-1111


 
xayam ©   (2010-05-10 22:10) [118]

если коротко, то примерно так осуществляется обход:

  r:= ""; // результирующая половина подпалендрома вместе с центром
  i:= 1; // первая строка
  j:= n; // правый столбец
  while i <> j do r:= r + getNext( i, j );

ну и прототип функции getNext:

function getNext ( var i, j: integer ): string;
begin
       //здесь твой анализ матрицы Mat[i, j]
       //точнее нужно рассмотреть четыре ячейки:
       //           Mat[i+1, j]
       //           Mat[i, j-1]
       //           Mat[i+1, j-1]
       //           Mat[i, j]
       //и в зависимости от их нулевого/ненулевого значения изменить
       //соответственно i и/или j для следующей итерации
end;

и вывод результата:

  writeln( IntToStr( 2*length( r ) - 1 ) );
  write(r);
  for i:= length(r) - 1 downto 1 do write(r[i]);


 
Родион   (2010-05-10 22:18) [119]


> function getNext ( var i, j: integer ): string;begin    
>    //здесь твой анализ матрицы Mat[i, j]        //точнее
> нужно рассмотреть четыре ячейки:        //           Mat[i+1,
>  j]        //           Mat[i, j-1]        //          
> Mat[i+1, j-1]        //           Mat[i, j]        //и в
> зависимости от их нулевого/ненулевого значения изменить
>        //соответственно i и/или j для следующей итерацииend;
>

и все их надо рассматривать, их же много


 
xayam ©   (2010-05-10 22:20) [120]

четыре всего



Страницы: 1 2 3 4 5 6 7 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.079 c
15-1267626055
Копир
2010-03-03 17:20
2010.08.27
Как удалось Архимеду сжечь корабли?


15-1267410604
Юрий
2010-03-01 05:30
2010.08.27
С днем рождения ! 1 марта 2010 понедельник


15-1273548240
Учащийся
2010-05-11 07:24
2010.08.27
Схемы хранения матриц.


2-1267876445
worldmen
2010-03-06 14:54
2010.08.27
Поиск пикселя в картинке.


3-1241656611
Раиса
2009-05-07 04:36
2010.08.27
ADO+dbf - как будут называться функции в select





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский