Як покращитись у вирішенні задач динамічного програмування


9

Нещодавно я натрапив на це питання: "Вам надається логічне вираження, що складається з рядка символів" true "," false "," і "," або ", і" xor ". Порахуйте кількість способів скористатися дужками в дужках вираз такий, що він буде оцінювати як істинне. Наприклад, є два способи в дужках "true і false xor true", таким чином, що він оцінює як true. "

Я знав, що це проблема динамічного програмування, тому я спробував самостійно знайти рішення, яке полягає в наступному. Припустимо, у нас вираз ABC .... D де '.' являє собою будь-яку з операцій і, або, xor і великі літери являють собою істинні або помилкові. Дозвольмо сказати, що кількість способів цього виразу розміром K для отримання істинного є N., коли до цього виразу додається нове булеве значення E, є два способи скористатись дужкою цього нового виразу 1. ((ABC .... D) .E) тобто. з усіма можливими дужками ABC .... D ми додаємо E в кінці. 2. (ABC (DE)), тобто. спочатку оцініть DE, а потім знайдіть кількість способів, яким це вираження розміру K може дати істинне.

припустимо, T [K] - це кількість способів виразу з розміром K створює істинне, тоді T [k] = val1 + val2 + val3, де val1, val2, val3 обчислюються наступним чином.

1) коли E групується з D.

i) Це не змінює значення D

ii) вона обертає значення D

у першому випадку val1 = T [K] = N (оскільки це зводиться до початкового виразу ABC ... D). У другому випадку переоцініть dp [K] зі значенням D, оберненим і що є val1.

2) коли Е групується з усім виразом.

// val2 містить кількість 'true' E буде створювати вирази, які давали 'true' серед всіх скоплених у скобках екземплярів ABC ...... D i) якщо true.E = true, тоді val2 = N

ii) якщо true.E = false, то val2 = 0

// val3 містить кількість 'true' E буде створюватись із виразами, які давали 'false' серед усіх скобкових екземплярів ABC ...... D

iii) якщо false.E = true, то val3 = (2 ^ (K-2) - N) = M, тобто. кількість способів вираз з розміром K створює помилковий [2 ^ (K-2) - це кількість способів скористатися дужкою виразу величини K].

iv) якщо false.E = false, то val3 = 0

Це основна ідея, яку я мав на увазі, але коли я перевірив її рішення http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf підхід був зовсім іншим. Чи можу хтось сказати мені, що я роблю неправильно і як я можу покращитись у вирішенні DP, щоб я міг придумати такі рішення, як те, що подано вище.

Заздалегідь спасибі.


Питання неправильне. true and (false xor true) = (true and false) xor true(Легко помітити шляхом зменшення обох до false xor true).
Пітер Тейлор

Чудове запитання! Мені теж потрібно покращити DP. Деякі кажуть "ах .. DP - це просто прості рекурсії". Це не!
Флоренц Целай

@Florents Целай тільки що побачив ваш коментар. Чому ти вважаєш, що це не так?
Джон Донн

Відповіді:


9

Відповідь, як і у багатьох речах, така:

Практика, практика, практика.

До речі, я вважаю, що у своєму рішенні ви потрапили в глухий кут, зробивши тривіальну помилку дуже рано: "Є два способи скористатись дужкою цього нового виразу" - чи не більше 2? Як щодо (A.B.(C.D.E)), наприклад?


"Як мені краще зробити X?" - "Зроби X!" ... звучить розумно ;-)
Йоахім Зауер

2

Я погоджуюся з окулусом, що практика є найбільш необхідною, також хотілося б додати, що вам потрібно звернути увагу на розпізнавання шаблонів проблем, які можна вирішити за допомогою DP (це досить добре пояснено в CLRS)

Ви можете знайти проблеми , які пов'язані з SPOJ динамічного програмування тут :)


будь ласка, прокоментуйте перед downvote, щоб я міг покращитись :)
nischayn22

це посилання не працює!
deebee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.