|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.03.2010, 09:52 | #1 |
Новичок
Джуниор
Регистрация: 21.03.2010
Сообщений: 4
|
Палиндром???
Задачка звучит так. Дано какое-то слово, состоящее только из латинских букв, не более 20 символов. При вычеркивании каких-нибудь символов из него, образуется палиндром. Нужно посчитать количество таких вычеркиваний в этом слове, если учитывать, что порядок вычеркивания это одно и тоже.
Например: ВАОВАВ Ответ: 22 |
21.03.2010, 11:04 | #2 |
Новичок
Джуниор
Регистрация: 21.03.2010
Сообщений: 4
|
Ну народ, плиз помогите(((
|
21.03.2010, 11:17 | #3 |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
Динамика на подстроках. Хранить количество способов для подстроки от
х до y. База динамики - 1 для одной буквы (тоесть с 1 буквы можно сделать палиндром ровно 1 способом) и для любой пары одинаковых символов. Дальше идем расширяющимся обходом, и к каждому варианту пытаемся "приписать" слева и справа по одинаковой букве, тоесть ищем для каждой подстроки, для которой ответ больше 0 те подстроки, для которых она увеличивает ответ, и прибавляем к ответам для этих подстрок значение для нашей строки. Ответом в конце будет сумма всех значений таблицы динамики. -=-=-=-=-=- Это если нормальное решение, которое работает и для 30, и даже для 40-50 символов (асимптотика N^4) в пределах секунды. Если делать "влоб", то полный перебор - перебираем все битовые маски и смотрим, дает ли нам определенная маска палиндром. Сложность N*2^N, тоесть для 20 мы имеем условно 20 миллионов операций, что не очень много, а уже для 30 будет более 30 миллиардов, что занимает несколько минут. |
21.03.2010, 11:32 | #4 |
Новичок
Джуниор
Регистрация: 21.03.2010
Сообщений: 4
|
Простым перебором мне не надо, у мя типа динамическое программирование. А вот твой метод я что-то не очень понял. Не разобрался!!!
|
21.03.2010, 11:53 | #5 |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
У мя типа тоже.
Вообще хоть немного в динамике разбираетесь? Если да, то сдесь ничего сложного. Сначала заполняем базу динамики. Потом перебираем все подстроки длины 1 и пробуем приписать к ним слева и справа по одинаковой букве (точнее не приписать, а найти в строке), для позиций тех букв, которые мы приписали - увеличиваем ответ на ответ для текущей подстроки (мы можем приписать эти 2 буквы к любому из "ответов" для даной подстроки). Потом длины 2, длины 3, длины 4... Если быть более точным, то в позиции динамики (х,у) мы храним количество способов вычеркнуть произвольное (возможно, пустое) множество символов из подстроки, которая начинается на позиции х и заканчивается на позиции у, не вычеркивая крайних слева и справа, так, чтоб образовался палиндром. Последний раз редактировалось LeBron; 21.03.2010 в 11:56. |
21.03.2010, 12:07 | #6 |
Новичок
Джуниор
Регистрация: 21.03.2010
Сообщений: 4
|
ммм.... кажется хоть чуть-чуть понял... хотя не понимаю, как заполнять динамику (я так понял вы так назвали матрицу, двумерный массив)...
|
21.03.2010, 12:29 | #7 | |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
Цитата:
Мы можем взять любой из этих вариантов (пример: если есть "авббга", то за нашим определением можно взять "аа","ава", "аба", "аба", "ага", "абба"), приписать к нему по одинаковой букве с каждой стороны - и получим новый палиндром. Поэтому мы для каждой подстроки перебираем все комбинации букв "слева-справа", тоесть 1 буква левее этой подстроки и 1 правее, если эти буквы одинаковы - то мы можем для подстроки, ограниченой уже этими буквами, увеличить ответ на ответ для текущей подстроки (ко всем ответам текущей подстроки приписать эти 2 буквы - и получим как раз такое число "дополнительных" ответов для той подстроки). Как двигаться по подстроках одинаковой длины - для нас не важно. Главное - перебрать все. Важно другое - то, что надо перебирать от более коротких к более длинным подстрокам. Если делать иначе, то может быть такое, что мы, рассматривая, к примеру, подстроку из 10 символов, будем иметь для нее неверный ответ, потому что еще не посчитали какой-то из палиндромов, которые можно приплюсовать за счет более короткой подстроки - скажем, 8 символов (которую мы не рассмотрели). Ну а если двигаться от более коротких к более длинным, то всегда будем влиять на результаты для подстрок, которые еще не рассмотрели, а не на те, которые уже прошли. Последний раз редактировалось LeBron; 21.03.2010 в 16:59. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Палиндром. Паскаль. | Nubas | Помощь студентам | 6 | 17.12.2009 21:23 |
C++ палиндром и логическая функция | Blondy | Помощь студентам | 9 | 18.11.2009 09:11 |
Палиндром в строке | semennn | Помощь студентам | 6 | 04.05.2009 23:36 |
Палиндром | Carbon | Помощь студентам | 9 | 12.11.2007 14:32 |