[๋ฐฑ์ค 10942 ๐ฅ] ํฐ๋ฆผ๋๋กฌ?
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์ ์ถ๋ ฅํ๋๋ก ํ๋ค.