Задачка про скобки

Тема в разделе "WASM.A&O", создана пользователем Nouzui, 26 дек 2006.

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Позаимствовал задачку одну:

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

    Пример:
    ????(?
    Ответ - 2

    Есть идеи кроме полного перебора?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Самый тупой вариант:
    Код (Text):
    1. int rec(char *pattern, int opened){
    2.     if(opened < 0) return 0;
    3.     switch(*pattern++){
    4.         case '(':
    5.             return rec(pattern, opened + 1);
    6.         case ')':
    7.             return rec(pattern, opened - 1);
    8.         case '?':
    9.             return rec(pattern, opened + 1) +
    10.                    rec(pattern, opened - 1);
    11.         default:
    12.             return (!opened);
    13.     }
    14. }
    15.  
    16. int solve(char *pattern){ return rec(pattern, 0); }
     
  3. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Quantum

    Не уверен, что в твоем варианте будет выполняться условие
    . Например в случае ?? у тебя по-моему будет два ответа: () и )(.

    Nouzui

    Посмотри здесь:
    http://www.wasm.ru/forum/viewtopic.php?pid=102625#p102625
    Я бы предожил перебирать деревья и откидывать не подходящие по сравнению с шаблоном.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Stiver
    Исправил. Первоначальный вариант работал, т.к. компилятор VC6 почему-то заменяет строку "????(?" на "??[?". Интересно, почему он так делает?
     
  5. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Quantum
    Потому что получается так называемый "trigraph" - http://en.wikipedia.org/wiki/C_trigraph :)
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Stiver
    Прикольная фишка - не знал. Спасибо!
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nouzui
    Если шаблон состоит из одних знаков вопроса длины n, то определение количества возможных расстановок скобок K(n) - это известная в комбинаторике задача о правильной расстановке скобок (см., например
    http://journal.issep.rssi.ru/articles/pdf/0102_103.pdf). Число K(n)=C(2n, n)/(n+1), где C(n,m)=n!/(m!*(n-m)!) - биномиальный коэффициент.
    Если известно, что на каких-то местах уже заданы скобки, то это будет более сложная задача.
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Вот сдесь разобрана эта задача.
    http://homepages.compuserve.de/chasluebeck/practic_info2.htm
    Собственно по этой книге ("Особенности национальных задач по информатике") все или почти все задачи прорешал в школе.
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Pavia
    Здесь алгоритм дан, а число вариантов зависит от шаблона, это и так понятно. А вот каков вид зависимости - это сложно определить.
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Pavia
    Самый тупой вариант оказался классическим :)
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Quantum
    На самом деле Ваш интуитивный вариант отразил классическую рекуррентную формулу, лежащую в основе подсчета.
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    все те же ветви и границы..