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

Вниз

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

 
rodion   (2010-05-07 07:30) [0]

Палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Подпалиндромом данной строки называется последовательность символов из данной строки, не обязательно идущих подряд, являющаяся палиндромом. Например, HELOLEH является подпалиндромом строки HTEOLFEOLEH. Напишите программу, находящую в данной строке подпалиндром максимальной длины.

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

program Project6;

{$APPTYPE CONSOLE}

uses
SysUtils;
var
Mat:array[1..100,1..100]of integer;
s:string;
s1:string;
i,j,n,d,j1,k,maxj,maxi:integer;

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;

begin
try
{ TODO -oUser -cConsole Main : Insert code here }
except
on E:Exception do
Writeln(E.Classname, ": ", E.Message);
end;
readln(s);
for I:=1 to length(s) do
for j := 1 to length(s) do
if i=j then Mat[i,j]:=1
else if i>j then Mat[i,j]:=0
else mat[i,j]:=-1;
maxi:=0;maxj:=0;
for i:=1 to length(s) do
for j:=1 to length(s) do
begin
Mat[i,j]:=f(i,j);
if (j-i+1>maxj-maxi+1)and(j-i+1=Mat[i,j]) then
begin
maxi:=i;
maxj:=j;
end;
end;
writeln(maxj-maxi+1);
writeln(copy(s,maxi,maxj-maxi+1));
readln;
end.

Заранее спасибо!


 
MBo ©   (2010-05-07 07:56) [1]

мпожно перевернуть строку и искать общую подпоследовательность максимальной длины с перехлестом не более, чем на один символ


 
xayam ©   (2010-05-07 08:21) [2]

не обязательно идущих подряд? это больше анаграмма, чем полиндром. И это... код можно прокомментировать


 
12 ©   (2010-05-07 08:26) [3]


> try
> { TODO -oUser -cConsole Main : Insert code here }
> except
> on E:Exception do
> Writeln(E.Classname, ": ", E.Message);
> end;

сильно


 
Игорь Шевченко ©   (2010-05-07 10:25) [4]


> try
> { TODO -oUser -cConsole Main : Insert code here }
> except
> on E:Exception do
> Writeln(E.Classname, ": ", E.Message);
> end;


ты откуда код списал, дубинушко ? Я бы только за это выгнал бы с треском


 
rodion   (2010-05-07 11:01) [5]

это можно удалить, это автоматом написалось...

вобщем люди, щас только с зачета, завалил..
препод сказал, что функцию ваще как бэ не нужна ибо там есть рекурсия
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
надо ее засунуть когда уже будет сформирован массив, вобщем что то в этом духе...а потом я, как сказал Игорь Шевченко, вылетел с треском..
народ помогите кто чем может, 17 мая меня отчисляют если не сдам(
такие дела..


 
Плохиш ©   (2010-05-07 11:09) [6]


> народ помогите кто чем может, 17 мая меня отчисляют если
> не сдам

в 17 мая переместить?


 
12 ©   (2010-05-07 11:12) [7]

код - каша
прямое не уважение к людям
ты думаешь кто-то будет тратить время на разбор, если тебе лень было потратить минутку на форматирование и комментарии?

Вообщем, ща Ега придет и скажет чего делать :)


 
Плохиш ©   (2010-05-07 11:15) [8]


> Вообщем, ща Ега придет и скажет чего делать

А, вот кто по пятницам подаёт :-))

PS. Что-то давно не видно всяких защитников немощных и обездоленных...


 
12 ©   (2010-05-07 11:26) [9]

не, Ега сайт призывник ру знает как точно пишется :)


 
12 ©   (2010-05-07 11:29) [10]

автору. Пока примерно так не будет - вряд ли чего дождешься.

 
// назначение: выбить из матрицы элементы по принципу левой ноги в кастрюле
 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; // Function


 
Rouse_ ©   (2010-05-07 11:40) [11]

Если придет Ега до 18 нуль-нуль, то будем карать... Не отвлекайте человека - ему код писать нужно :)


 
Rouse_ ©   (2010-05-07 11:43) [12]

зы: резюме местного it отдела - "код уныл" :)


 
rodion   (2010-05-07 13:13) [13]

> народ помогите кто чем может, 17 мая меня отчисляют если
> не сдам

в 17 мая переместить?

17 отчислят если не сдам во вторник крайний срок..

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


 
Palladin ©   (2010-05-07 13:17) [14]

ну не нужны стране такие космонавты


 
Sha ©   (2010-05-07 13:19) [15]

> с января парюсь надо этой задачой

Значит наибольшую общую подпоследоватьность двух последоватьностей
без всякой палиндромности находить уже умеешь?

Имеешь отформатированный отлаженный код для стандартной задачи?


 
Anatoly Podgoretsky ©   (2010-05-07 13:33) [16]

> rodion  (07.05.2010 11:01:05)  [5]

Ну время приобрести зачет еще есть, ты посмотри местные объявления, наверняка кто то торгует этим.


 
Б   (2010-05-07 13:42) [17]

За деньгу в сети всегда решат.


 
rodion   (2010-05-07 16:50) [18]

-
> Имеешь отформатированный отлаженный код для стандартной
> задачи?

я в задаче разобрался, проблема в том что реализовать не могу, вот и прошу помощи у вас. поможете или нет?(


 
antonn ©   (2010-05-07 16:51) [19]


> Palladin ©   (07.05.10 13:17) [14]
>
> ну не нужны стране такие космонавты

а солдаты такие нужны?


 
Leonid Troyanovsky ©   (2010-05-07 17:28) [20]


> antonn ©   (07.05.10 16:51) [19]

> а солдаты такие нужны?

Солдаты всякие Родине пригодятся.
Кто программу сварганит, кто борщ сварит, кто споет -
главное чтоб для общей цели.

offtop
А чего, оный Подпалендром - это, дейс-но, динамческое
программирование, бо мы, как-то, учили, что это Беллман и др.?

Или я опять от жизни отстал :( ?
end offtop

--
Regards, LVT.


 
Smile   (2010-05-07 17:38) [21]

По поводу Бэллмана ...
А у меня (я больше прикладник) это Дженкинс и Бокс
:)


 
Leonid Troyanovsky ©   (2010-05-07 17:55) [22]


> Smile   (07.05.10 17:38) [21]

> А у меня (я больше прикладник) это Дженкинс и Бокс

Не запутывай нас, оные из планирования эксперимента, IMHO,
вроде крутового восхождения.

--
Regards, LVT.


 
Smile   (2010-05-07 18:02) [23]

> Leonid Troyanovsky ©   (07.05.10 17:55) [22]

Это было так давно, что возможно и ошибся:(
"Беллман Р., Энджел Э. Динамическое программирование и уравнения в частных производных", гораздо ближе ...
:)


 
Sha ©   (2010-05-07 18:52) [24]

> rodion   (07.05.10 16:50) [18]
> я в задаче разобрался,

Ну, если в задаче разобрался, то должен понимать, что она родственна задаче
поиска максимальной подпоследовательности (LCS) двух последовательностей.

Раз мучаешься с января, то наверняка гуглил неоднократно и ссылка
http://ru.wikipedia.org/wiki/Наибольшая_общая_подпоследовательность
тебе знакома.

> проблема в том что реализовать не могу,

Наверняка там или еще где скачал, понял и отладил готовую реализацию

> вот и прошу помощи у вас. поможете или нет?(

Конечно, поможем. Советом.
Заметь, что твоя задача решается с помощью того же алгоритма.
Пусть длина твоей строки равна L. Тебе надо найти максимальную LCS
для L всевозможных пар строк, образованных началом длины Y=1..L
и хвостом длины X=L+1-N. Все такиe LCS лежат на неглавной диагонали матрицы.
Т.е. тебе даже не надо строить всю мартицу для исходной и перевернутой строки.
А дальше, как обычно, из найденного максимального элемента
восстанавливаешь общую подпоследовательность. Это начало палиндрома.
Хвост попробуй найти сам.
Рассмотри случаи четной и нечетной длины палиндрома.


 
Sha ©   (2010-05-07 18:59) [25]

Опечатка, надо так
и хвостом длины X=L+1-Y.


 
Германн ©   (2010-05-08 02:38) [26]


> ты откуда код списал, дубинушко

Причем даже не выучил/заметил как пишется термин Палиндром
В стройбат однозначно!


 
rodion   (2010-05-08 11:56) [27]

Sha, спс что помогаешь, но блин это с++(я про ссылку). надо разбираться сидеть, а времени разбираться нету(((


> Германн ©   (08.05.10 02:38) [26]
> > ты откуда код списал, дубинушкоПричем даже не выучил/заметил
> как пишется термин ПалиндромВ стройбат однозначно!

может хватит критики не по делу? и так не по себе


 
Sha ©   (2010-05-08 12:26) [28]

тут на псевдокоде, почти паскаль

http://en.wikipedia.org/wiki/Longest_common_subsequence_problem


 
Плохиш ©   (2010-05-08 15:53) [29]


> Sha ©   (08.05.10 12:26) [28]

Ты не умничай, ты код для копи-пасте давай, а то

> надо разбираться сидеть, а времени разбираться нету(((


> и так не по себе


 
Игорь Шевченко ©   (2010-05-09 01:15) [30]


> надо разбираться сидеть, а времени разбираться нету(((


это разве наши проблемы ?


 
Германн ©   (2010-05-09 01:21) [31]


> это разве наши проблемы ?

Отчасти это твоя проблема, Игорь. И также других модераторов. Сколько ещё веток на одну и ту же тему заведёт автор за оставшиеся 8 дней?
:)


 
xayam ©   (2010-05-10 11:13) [32]


> Например, HELOLEH является подпалиндромом строки HTEOLFEOLEH.
>  Напишите программу, находящую в данной строке подпалиндром
> максимальной длины.

может я не прав, но это же не максимальный подпалендром, еще две буквы "О" есть. Не? Я по-своему решил, вроде работает, но нужно на разных строках потестировать:

program MaxPolendrom;
{$APPTYPE CONSOLE}
uses SysUtils;
var s: string;
   i, j, k, n, b, c: integer;
   rs: set of 1..100;
   l, r: array[1..100] of integer;
   flag: boolean;
begin
  readln(s);
  for i:= 1 to 100 do begin
      l[i]:= 0;
      r[i]:= 0;
  end;
  n:= length(s);
  i:= 1;
  j:= 2;
  k:= 0;
  rs:= [];
  flag:= false;
  while true do begin
      if s[i] = s[j] then begin
         k:= k + 1;
         l[k]:= i;
         r[k]:= j;
         rs:= rs + [j] {+ [i]};
      end;
      if flag or ( s[i] = s[j] ) then begin
         i:= i + 1;
         b:= i;
         while i in rs do
          i:= i + 1;
         if ( i >= n ) or ( ( i = b ) and ( i in rs ) ) then
          break;
         flag:= false;
         j:= i;
      end;
      j:= j + 1;
      b:= j;
      while j in rs do
            j:= j + 1;
      if ( j >= n + 1 ) or ( ( j = b ) and ( j in rs ) ) then
       flag:= true;
  end;

  for i:= 1 to k do
  write( " left [k]: " + IntToStr( l[i] ) + "  " );
  writeln;

  for i:= 1 to k do
  write( " right[k]: " + IntToStr( r[i] ) + "  " );
  writeln;

  c:= 0;
  for i:= 1 to n do begin
    flag:= true;
    for j:= 1 to k do
    if ( l[j] = i ) or ( r[j] = i ) then flag:= false;
    if flag then begin
     c:= i;
     break;
    end;
  end;

  if c > 0 then writeln( IntToStr( 2*k + 1 ) )
  else writeln( IntToStr( 2*k ) );
  for i:= 1 to k do
   write(s[l[i]]);
  if c > 0 then write(s[c]); //центральный символ обязателен?
  for i:= k downto 1 do
   write(s[r[i]]);
  readln;
end.


 
xayam ©   (2010-05-10 11:47) [33]

после readln(s); еще можно вставить проверку на пустую строку, иначе ошибка вылетает:

if s = "" then begin
     write("0");
     readln;
     exit;
end;


 
xayam ©   (2010-05-10 12:17) [34]


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

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


 
KilkennyCat ©   (2010-05-10 12:31) [35]


> rs: set of 1..100;
>    l, r: array[1..100] of integer

в свою очередь вызывает


> for i:= 1 to 100 do begin
>       l[i]:= 0;
>       r[i]:= 0;
>   end;


что некрасиво.


 
KilkennyCat ©   (2010-05-10 12:38) [36]

А вообще, решение простое:
MaxPodPalindrom := copy(Palindrom, 2, length(Palindrom)-2);


 
xayam ©   (2010-05-10 12:46) [37]


> KilkennyCat ©   (10.05.10 12:31) [35]
> > rs: set of 1..100;
> >    l, r: array[1..100] of integer
> в свою очередь вызывает
> что некрасиво.

ну да это я по привычке обнуляю :)

> MaxPodPalindrom := copy(Palindrom, 2, length(Palindrom)-
> 2);

это что такое? тут же не только максимальный подпалендром, но и анаграмма одновременно :) к тому же в входной строке может быть уже задан палендром, тогда эту входную строку нужно вывести в том же виде. Не?


 
KilkennyCat ©   (2010-05-10 13:05) [38]

мое решение полностью удовлетворяет поставленному условию.


 
KilkennyCat ©   (2010-05-10 13:07) [39]

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


 
xayam ©   (2010-05-10 13:09) [40]

в любом случае у меня короче решение:

M:=copy(P,2,length(P)-2)

:)



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

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

Наверх





Память: 0.57 MB
Время: 0.062 c
2-1272565792
Bee
2010-04-29 22:29
2010.08.27
single and string


15-1271847638
Scot Storch
2010-04-21 15:00
2010.08.27
БД кожгалантерейного магазина


15-1273860812
AKE
2010-05-14 22:13
2010.08.27
Согласитесь, что нехватает оператора типа a < x < b


2-1269763764
Alex_C
2010-03-28 12:09
2010.08.27
Инициализация глобальных переменных


4-1234818468
istok
2009-02-17 00:07
2010.08.27
проблема с CoShellWindows





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский