Нещодавно я натрапив на це питання: "Вам надається логічне вираження, що складається з рядка символів" 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
).