IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задачи на палиндромы, палиндромы!Помогите пожалуста срочно!
Snake08
сообщение 6.11.2008 17:01
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Николай

Репутация: -  0  +


Палиндромы 1!
Задана строка, которая составляется из малых латинских букв. Разрешается удалять из строки определенные буквы. Сколькими разными образами можно при этом получить палиндром?
Входные данные: заданная строка находится в файле palindrome1.dat, длина его не превышает 30 символов
Исходные данные: в первую строку файла palindrome1.sol надо вывести искомое количество образов получения палиндрому
Пример входных и исходных данных:
palindrome1.dat
aab
palindrome1.sol
4
Объяснение: палиндром можно получить, удалив символы 1) 1 і 2; 2) 1 і 3; 3) 2 і 3; 4) 3!
Палиндромы 2!
Задана строка, которая составляется из малых латинских букв. Нужно разбить его на минимальное возможное количество палиндромов.
Входные данные: заданная строка находится в файле palindrome2.dat, длина не превышает 2000 символов
Исходные данные: в первую строку файла palindrome2.sol надо вывести минимальное количество палиндромов, на которые можно разбить строку
Пример входных и исходных данных:
palindrome2.dat
abbacbb
palindrome2.sol
3
Объяснение: abbacbb = abba + c + bb
wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 8.11.2008 9:55
Сообщение #2


Гость






feniks25, как говорил один из героев Ж.Верна "не следует смешивать статику с динамикой, это может привести к серьёзным промахам."

Цитата
надо создавать массив, а это ещё больше памяти...
Да, надо... Но только учти, что массив (длиной 2000 символов) описывается глобально 1 раз, плюс добавляется еще 3 целочисленных массива (третий - для сохранения позиций этих самых палиндромов, так что можно в принципе обойтись и двумя) тоже по 2000 Integer-ов, итого в худшем случае все это удовольствие стоит тебе 14000 байт. А уж 2000 уровней рекурсии Паскаль как-нибудь осилит с (учётом того, что на каждом витке в стек кладётся не огромная строка, и не ещё бОльший массив, а всего несколько целочисленных переменных):

{ Ну, это не обязательно, это моя старая привычка имитации X++ и X-- }
function incr(var X: integer): integer;
begin incr := X; inc(X); end;
function decr(var X: integer): integer;
begin decr := X; dec(X); end;

const
maxLen = 2000;
var
A : array[1 .. maxLen] of char;
Yl, Res, positions: array [1 .. maxLen] of integer;

function is_palindrom(start, finish: integer): boolean;
begin
is_palindrom := false;
while start <= finish do
if A[incr(start)] <> A[decr(finish)] then exit;
is_palindrom := true;
end;

var n, Rmin, Rv: Integer;

procedure check(start: integer);
var i, j: integer;
begin
if Rv < Rmin - 1 then
for i := n downto start do
if Rv < Yl[i] then if is_palindrom(start, i) then begin

Yl[i] := incr(Rv);
Res[Rv] := i;
if i < n then check(i + 1)
else
if Rv < Rmin then begin
Rmin := Rv;
for j := 1 to Rv do positions[j] := Res[j];
end;
dec(Rv);

end;
end;

var i: integer;
begin
Rmin := maxLen;
Rv := 0;
for i:=1 to maxLen do Yl[i] := maxLen;

n := 0;

{ Немного необычное заполнение массива, все-же не строка, чтоб ReadLn использовать }
while not eoln do begin
inc(n); read(a[n]);
end;

check(1);
writeln(Rmin);

{ При желании печатаем и сами палиндромы, составляющие строку }
(*
j:=0;
for i:=1 to Rmin do begin
writeLn(Copy(A,j+1,positions[i] - j)); j := positions[i]
end;
*)
end.


Сообщение отредактировано: volvo - 8.11.2008 9:56
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Snake08   Задачи на палиндромы   6.11.2008 17:01
feniks25   ну не знаю задача может мудрёная но не сложная что...   6.11.2008 21:19
volvo   Потому что любую строку можно разбить на палиндром...   6.11.2008 21:26
Snake08   Я в паскале ноль можете мне написать в паскале...   6.11.2008 21:47
Lapp   Я в паскале ноль можете мне написать в паскале...   7.11.2008 2:20
feniks25   слушайте, задумался, чтобы найти минимальное колич...   7.11.2008 8:19
Lapp   но как хранить данные об исключениях (сначала дума...   7.11.2008 8:52
feniks25   Рекурсия? :) Да, рекрсия это круто и у меня с не...   7.11.2008 18:18
volvo   Возможно, что это даже отработает на 32-битном ком...   7.11.2008 18:44
feniks25   хм... ну тогда можно не использовать рекурсию, а с...   7.11.2008 19:29
Lapp   хм... ну тогда можно не использовать рекурсию, а с...   8.11.2008 7:50
feniks25   Если заменить первый цикл на while или хотя бы вс...   8.11.2008 9:29
volvo   feniks25, как говорил один из героев Ж.Верна ...   8.11.2008 9:55
feniks25   а зачем ещё три массива, если все нужные операции ...   8.11.2008 17:26
volvo   Если ты на 100% уверен, что следующим же вопросом ...   8.11.2008 17:45


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 16.08.2025 5:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"