아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

Płytkie nawiasowania

시간 제한1초메모리 제한1024 MB

요약
올바른 괄호열이 주어질 때, 여전히 올바르면서 깊이가 H 이하가 되도록 뒤집어야 하는 괄호의 최소 개수를 구한다.
난이도

보통10점 중 6점

유형
동적 계획법, 그리디, 스택
정답자
아직 제출이 없습니다

문제

Ciąg składający się z nawiasów otwierających i zamykających nazwiemy nawiasowaniem. Nawiasowanie jest poprawne, jeśli nawiasy można tak połączyć w pary, żeby były poprawnie zagnieżdżone. Definiujemy też głębokość zagnieżdżenia.

Formalnie poprawne nawiasowanie można zdefiniować rekurencyjnie:

  • Ciąg pusty jest poprawnym nawiasowaniem; jego głębokość wynosi 0.
  • Jeśli ciąg w jest poprawnym nawiasowaniem o głębokości h, to ciąg (w), który powstaje przez dopisanie nawiasu otwierającego na początku i nawiasu zamykającego na końcu, jest poprawnym nawiasowaniem o głębokości h + 1.
  • Jeśli ciągi w1 i w2 są poprawnymi nawiasowaniami o głębokościach, odpowiednio, h1 i h2, to ciąg w1w2, który powstaje przez ich sklejenie, jest poprawnym nawiasowaniem o głębokości max(h1, h2)

Dane są poprawne nawiasowanie w i liczba H. Przez odwrócenie nawiasu rozumiemy zmianę pewnego nawiasu otwierającego na zamykający lub odwrotnie. Ile minimalnie odwróceń nawiasów trzeba wykonać, żeby uzyskać poprawne nawiasowanie o głębokości nie większej niż H?

입력

W pierwszym wierszu wejścia znajdują się dwie liczby całkowite n i H (n ≥ 2, 1 ≤ H ≤ n/2) oznaczające długość ciągu oraz maksymalną głębokość.

W drugim wierszu znajduje się n-literowy napis składający się ze znaków ( i ), będący poprawnym nawiasowaniem.

출력

Twój program powinien wypisać jedną liczbę całkowitą oznaczającą minimalną liczbę odwróceń nawiasów, jakie trzeba wykonać, aby uzyskać poprawne nawiasowanie o głębokości co najwyżej H.

힌트

Wyjaśnienie przykładu: Ciąg (()(())) ma głębokość 3. Odwrócenie piątego i szóstego nawiasu da nam ciąg (()()()) o głębokości 2.

Jedno odwrócenie nawiasu nie wystarczy, bo nie uzyskamy w ten sposób poprawnego nawiasowania.

예제1

  1. 예제 1

    입력
    8 2
    (()(()))
    
    예상 출력
    2