์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 10942 ๐Ÿฅ‡] ํŒฐ๋ฆผ๋“œ๋กฌ?

1eehyunji 2023. 7. 12. 01:43
 

10942๋ฒˆ: ํŒฐ๋ฆฐ๋“œ๋กฌ?

์ด M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ™์ค€์ด์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ช…์šฐ์˜ ๋‹ต์„ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ถœ๋ ฅํ•œ๋‹ค. ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ์—๋Š” 1, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

๋ช…์šฐ๋Š” ํ™์ค€์ด์™€ ํ•จ๊ป˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋†€์ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋จผ์ €, ํ™์ค€์ด๋Š” ์ž์—ฐ์ˆ˜ N๊ฐœ๋ฅผ ์น ํŒ์— ์ ๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ, ๋ช…์šฐ์—๊ฒŒ ์งˆ๋ฌธ์„ ์ด M๋ฒˆ ํ•œ๋‹ค.

๊ฐ ์งˆ๋ฌธ์€ ๋‘ ์ •์ˆ˜ S์™€ E(1 ≤ S ≤ E ≤ N)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, S๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ E๋ฒˆ์งธ ๊นŒ์ง€ ์ˆ˜๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉฐ, ๋ช…์šฐ๋Š” ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค ๋˜๋Š” ์•„๋‹ˆ๋‹ค๋ฅผ ๋งํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜๊ฐ€ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ  ํ•˜์ž.

  • S = 1, E = 3์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • S = 2, E = 5์ธ ๊ฒฝ์šฐ 2, 1, 3, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋‹ค.
  • S = 3, E = 3์ธ ๊ฒฝ์šฐ 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • S = 5, E = 7์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

์ž์—ฐ์ˆ˜ N๊ฐœ์™€ ์งˆ๋ฌธ M๊ฐœ๊ฐ€ ๋ชจ๋‘ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช…์šฐ์˜ ๋Œ€๋‹ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 2,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜ N๊ฐœ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์น ํŒ์— ์ ์€ ์ˆ˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์…‹์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ํ•œ ์งˆ๋ฌธ์˜ ๊ฐœ์ˆ˜ M (1 ≤ M ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋„ท์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ๋ช…์šฐ์—๊ฒŒ ํ•œ ์งˆ๋ฌธ S์™€ E๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ด M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ™์ค€์ด์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ช…์šฐ์˜ ๋‹ต์„ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ถœ๋ ฅํ•œ๋‹ค. ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ์—๋Š” 1, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฌธ์ œํ’€์ด

import sys

# ์ˆซ์ž์˜ ๊ฐœ์ˆ˜
n=int(sys.stdin.readline())
numbers=list(map(int, sys.stdin.readline().split(' ')))
# dummy
numbers.insert(0,0)
# ์งˆ๋ฌธ์˜ ๊ฐœ์ˆ˜
m=int(sys.stdin.readline())


dp=[[False]*(n+1) for _ in range(n+1)]

for i in range(1, n+1):
    dp[i][i]=True

for i in range(1, n):
    if numbers[i]==numbers[i+1]:
        dp[i][i+1]=True


for i in range(3,n+1):
    for j in range(1,i-1):
        if numbers[i]==numbers[j] and dp[j+1][i-1]:
            dp[j][i]=True


for _ in range(m):
    s,e=map(int, sys.stdin.readline().split(' '))
    # ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ฝ”๋“œ(์ตœ์•…์˜ ๊ฒฝ์šฐ 10^6*10^3)
    # check=numbers[s:e+1]
    # for i in range(len(check)//2):
    #     if check[i]==check[len(check)-i-1]:
    #         continue
    #     else:
    #         print(0)
    #         break
    # else:
    #     print(1)
    if dp[s][e]:
        print(1)
    else:
        print(0)

์ฒ˜์Œ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ฌธ์ œ์˜ ๊ฐœ์ˆ˜์ธ m์ด ์ตœ๋Œ€ 1,000,000์ด์—ˆ๊ณ , ์ˆซ์ž์˜ ๊ฐœ์ˆ˜์ธ n์ด ์ตœ๋Œ€ 2,000์ด์—ˆ์œผ๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—” 10^9์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

 

๊ณ ๋ฏผ์„ ํ•˜๋‹ค DP๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. 

1 2 1 3 1 2 1

์ˆซ์ž๊ฐ€ ์œ„์˜ ํ˜•์‹๊ณผ ๊ฐ™์„ ๋•Œ, DP ๋ฐฐ์—ด์˜ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

๊ฐ™์€ ์ธ๋ฑ์Šค๋ผ๋ฆฌ๋Š” ์ˆซ์ž๊ฐ€ ํ•œ ๊ฐœ์ด๋ฏ€๋กœ ํŒฐ๋ฆฐ๋“œ๋กฌ ์„ฑ๋ฆฝ

1๋ฒˆ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ ์„ฑ๋ฆฝ

1๋ฒˆ๋ถ€ํ„ฐ 7๋ฒˆ๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ ์„ฑ๋ฆฝ

2๋ฒˆ๋ถ€ํ„ฐ 6๋ฒˆ๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ ์„ฑ๋ฆฝ

.

.

.

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์„ฑ๋ฆฝ์„ ์ €์žฅํ•ด์คฌ๋‹ค. 

ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์„ฑ๋ฆฝ์€ numbers[i]==numbers[j]์ด๋ฉด์„œ dp[j+1][i-1]์ด True์ผ ๋•Œ ์„ฑ๋ฆฝํ•œ๋‹ค. 

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์šฐ์„  dp[i][i]๋Š” ๋ชจ๋‘ True๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ , ์—ฐ๋‹ฌ์•„ ๋ถ™์–ด ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ˆ˜๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ์— dp[i][i+1]์„ True๋กœ ์ดˆ๊ธฐํ™”ํ•ด์คฌ๋‹ค. 

๊ทธ๋ฆฌ๊ณ , ๋‚˜๋จธ์ง€๋Š” numbers[i]==numbers[j]์ด๋ฉด์„œ dp[j+1][i-1]์ธ์ง€ ํ™•์ธํ•˜๋ฉด์„œ ์„ฑ๋ฆฝํ•˜๋ฉด True๋ฅผ ์ €์žฅํ•ด์คฌ๋‹ค. 

ํ™”์‚ดํ‘œ๋ฅผ ์นœ ๋ฐฉํ–ฅ์œผ๋กœ DP ๊ฐ’์„ ์ฑ„์›Œ์ค˜์•ผ ์ œ๋Œ€๋กœ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , ํŒŒ๋ž€์ƒ‰ ์›์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์€ ์•ž์„  2๊ฐœ์˜ for๋ฌธ์œผ๋กœ ๊ฐ’์ด ๋“ค์–ด๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— 

for i in range(3,n+1):
    for j in range(1,i-1):
        if numbers[i]==numbers[j] and dp[j+1][i-1]:
            dp[j][i]=True

์œ„์™€ ๊ฐ™์ด ํƒ์ƒ‰ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ–ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋“ค์„ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ dp[s][e]๊ฐ€ True๋ฉด 1์„ ์ถœ๋ ฅํ•˜๊ณ , False๋ฉด 0์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค.