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

У меня есть строка длины 1 <= |S| <= 100 и K (1 <= K <= 10)

Эта строка содержит digits < K и вопросительные знаки. Я хочу заменить эти вопросительные знаки на digits < K, чтобы две соседние цифры не были равны. Строка круглая, поэтому она не может быть такой: 1?1 или 11?.

Полученная строка должна быть лексикографически самой маленькой.

Пример ввода и вывода

input:
K = 4
string = ?????

output:
01012

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

Любая помощь для подхода dp или сложные тестовые примеры, которые не позволяют жадным?

Спасибо,


person M.SW    schedule 04.06.2012    source источник
comment
Откуда вы знаете, что это не удается, если вы не знаете тестовых примеров, на которых он терпит неудачу?   -  person Scott Hunter    schedule 04.06.2012
comment
Разве не сгенерировал бы тестовый пример, который не прошел бы жадное требование знать, какой жадный алгоритм используется?   -  person Scott Hunter    schedule 04.06.2012
comment
@ScottHunter дает неправильный ответ при отправке на онлайн-судью, и я эффективно реализовал свое жадное решение, поэтому я уверен, что ему нужен подход dp   -  person M.SW    schedule 04.06.2012
comment
мой жадный подход состоит в том, чтобы перебирать слева направо и помещать минимальный допустимый k в каждый индекс вопросительного знака   -  person M.SW    schedule 04.06.2012
comment
@ n.m. если у вас индекс 0, то ваши соседи будут ((LENGTH (S) - 1), 1)   -  person M.SW    schedule 04.06.2012
comment
K = 2, ???0?? терпит неудачу при жадном подходе. Попытайтесь понять почему.   -  person Daniel Fischer    schedule 04.06.2012
comment
@DanielFischer: Хороший пример. Однако есть еще жадный подход, который действительно сможет решить эту проблему. Это просто не тот, о котором говорилось выше. Для решения этой проблемы не требуется DP.   -  person LiKao    schedule 04.06.2012
comment
@LiKao Я не нашел времени, чтобы доказать это, но я так подумал. Думаю, при анализе примера должно стать понятно, как модифицировать алгоритм.   -  person Daniel Fischer    schedule 04.06.2012
comment
@DanielFischer: Я тоже этого не доказал, но уверен, что это должно сработать. Матроиды - страшные звери, поэтому я стараюсь не испытывать матроидов в это время вечера.   -  person LiKao    schedule 04.06.2012
comment
Это вопрос из текущего конкурса codechef.com/JUNE12/problems/CAKEDOOM. Я считаю неэтичным задавать такие вопросы во время соревнований!   -  person Anup Kalbalia    schedule 06.06.2012


Ответы (2)


Если у вас есть цифра на одном конце строки, жадный алгоритм даст вам правильный ответ.

Если ваша строка начинается и заканчивается вопросительным знаком, у вас есть 2 варианта для первого символа (0 или 1), запустите жадный алгоритм в обоих случаях и выберите лучший.

Неверный ответ, как указывает Ликао:

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

person Thomash    schedule 04.06.2012
comment
Не совсем так. Я думаю, чтобы минимизировать это, нужно поставить первый вопросительный знак перед (а не после) известной цифры. Но принцип тот же. - person LiKao; 04.06.2012
comment
Абсолютно верно. Greedy сделает всю работу, но вы должны повернуть строку так, чтобы начать с фиксированного граничного условия. - person valdo; 05.06.2012

Его простой возврат с возвратом, imo. Зачем усложнять его с помощью жадных или динамических.

person shadow    schedule 07.06.2012
comment
Нет, конечно, со временем выйдет из строя. со строкой в ​​худшем случае длиной 100, заполненной символом '?' - person M.SW; 08.06.2012