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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2008, 20:21   #1
Snake08
Пользователь
 
Регистрация: 06.11.2008
Сообщений: 25
По умолчанию Палиндромы

Палиндромы 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
Snake08 вне форума Ответить с цитированием
Старый 06.11.2008, 23:52   #2
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

Вот первая. Динамика рулит)))

Код:
var a:array[0..30,0..30] of longint;
    i,j,n,x,y:byte;
    s:string;
begin
 readln(s);
 n:=length(s);
 for i:=1 to n do
  a[i,i]:=1;

 for j:=2 to n do
  for i:=1 to n-j+1 do
   if(s[i]=s[i+j-1]) then a[i+j-1,i]:=a[i+j-2,i]+a[i+j-1,i+1]+1
   else a[i+j-1,i]:=a[i+j-2,i]+a[i+j-1,i+1]-a[i+j-2,i+1];

 writeln(a[n,1]);
 readln;
end.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.11.2008, 00:32   #3
Snake08
Пользователь
 
Регистрация: 06.11.2008
Сообщений: 25
По умолчанию

Спасибо Min за 1 задачку большое человечиское! А попробуй зделать еще й 2!Пожалуста!
Snake08 вне форума Ответить с цитированием
Старый 07.11.2008, 11:08   #4
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

не уверен на 100%, но кажись работает)))))
Код:
var a:array[1..2000,1..2000] of byte;

function f(x,y:byte):byte;
var i:byte;
    minA,q:byte;
begin
 minA:=255;
 for i:=y to x-1 do
  begin
   q:=a[i,y]+a[x,i+1];
   if q<MinA then MinA:=q;
  end;
 f:=MinA;
end;

function min(x1,x2:byte):byte;
begin
 if(x1>x2) then min:=x2
  else min:=x1;
end;

function max(x1,x2:byte):byte;
begin
 if(x1>x2) then max:=x1
  else max:=x2;
end;

var i,j,n:byte;
    s:string;
begin
 readln(s);
 n:=length(s);
 for i:=1 to n do
  a[i,i]:=1;
 for i:=2 to n do
  if(s[i]=s[i-1]) then a[i,i-1]:=1 else a[i,i-1]:=2;

 for i:=3 to n do
  for j:=n-i downto 0 do
   if(s[i+j]<>s[j+1]) then a[i+j,j+1]:=f(i+j,j+1)
    else a[i+j,j+1]:=min(a[i+j-1,j+2],max(a[i+j-1,j+1],a[i+j,j+2]));

 writeln(a[n,1]);
 readln;
end.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.11.2008, 11:10   #5
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

только поменяй byte на integer для больших чисел
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.11.2008, 16:02   #6
Snake08
Пользователь
 
Регистрация: 06.11.2008
Сообщений: 25
По умолчанию

""var a:array[1..2000,1..2000] of byte;""
Вот ета строка не работает до 2000 только до 200, и когда меняю на integer или longint то выбивает ошибку што очень большая структура!
Подскажите што можно зделать!
Snake08 вне форума Ответить с цитированием
Старый 08.11.2008, 09:55   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

дэээ..... чет не подумал...... как вариант могу предложить использовать вместо массива 4х-направленный список..... есть ещё одна мысль, но это долго объяснять.....
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Числа Палиндромы в С++ grerg Помощь студентам 0 27.11.2007 11:42