[BOJ][๐ก3][๋ฐฑ์ค#01937] ์์ฌ์์ด ํ๋ค
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
n ร n์ ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค. ์์ฌ์์ด ํ๋ค๋ ์ด๋ค ์ง์ญ์์ ๋๋๋ฌด๋ฅผ ๋จน๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณณ์ ๋๋๋ฌด๋ฅผ ๋ค ๋จน์ด ์น์ฐ๋ฉด ์, ํ, ์ข, ์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ๊ณณ์์ ๋๋๋ฌด๋ฅผ ๋จน๋๋ค. ๊ทธ๋ฐ๋ฐ ๋จ ์กฐ๊ฑด์ด ์๋ค. ์ด ํ๋ค๋ ๋งค์ฐ ์์ฌ์ด ๋ง์์ ๋๋๋ฌด๋ฅผ ๋จน๊ณ ์๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ฉด ๊ทธ ์ฎ๊ธด ์ง์ญ์ ๊ทธ ์ ์ง์ญ๋ณด๋ค ๋๋๋ฌด๊ฐ ๋ง์ด ์์ด์ผ ํ๋ค. ์ด ํ๋ค์ ์ฌ์ก์ฌ๋ ์ด๋ฐ ํ๋ค๋ฅผ ๋๋๋ฌด ์ฒ์ ํ์ด ๋์์ผ ํ๋๋ฐ, ์ด๋ค ์ง์ ์ ์ฒ์์ ํ์ด ๋์์ผ ํ๊ณ , ์ด๋ค ๊ณณ์ผ๋ก ์ด๋์ ์์ผ์ผ ํ๋ค๊ฐ ์ต๋ํ ๋ง์ ์นธ์ ๋ฐฉ๋ฌธํ ์ ์๋์ง ๊ณ ๋ฏผ์ ๋น ์ ธ ์๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ์ด ์ฌ์ก์ฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ์ด๋ค. n ร n ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์ฃผ์ด์ ธ ์์ ๋, ์ด ํ๋ค๊ฐ ์ต๋ํ ๋ง์ ์นธ์ ์ด๋ํ๋ ค๋ฉด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํตํ์ฌ ์์ง์ฌ์ผ ํ๋์ง ๊ตฌํ์ฌ๋ผ.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋๋๋ฌด ์ฒ์ ํฌ๊ธฐ n(1 โค n โค 500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋์งธ ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ๋๋๋ฌด ์ฒ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋๋ฌด ์ฒ์ ์ ๋ณด๋ ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ๋๊ณ ๊ฐ ์ง์ญ์ ๋๋๋ฌด์ ์์ด ์ ์ ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ค. ๋๋๋ฌด์ ์์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ํ๋ค๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
4
14 9 12 10
1 11 5 4
7 15 2 13
6 3 16 8
์ถ๋ ฅ
4
My Sol
import sys
sys.setrecursionlimit(250000)
input = sys.stdin.readline
def check_around(i, j):
global dp, N, visit
if dp[i][j]: return dp[i][j]
visit[i][j] = 1
cur, flag = 0, 0
for di, dj in ((-1,0),(1,0),(0,1),(0,-1)):
si, sj = i+di, j+dj
if not (0<=si<N and 0<=sj<N): continue
if mat[i][j] >= mat[si][sj]: continue
if dp[si][sj]:
flag = 1
if cur < dp[si][sj]:
cur = dp[si][sj]
continue
if visit[si][sj]: continue
check_cnt = check_around(si, sj)
if check_cnt: flag = 1
if cur < check_cnt:
cur = check_cnt
dp[i][j] = cur+1 if (cur or flag) else -1
return dp[i][j]
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
dp = [[0]*N for _ in range(N)]
visit = [[0]*N for _ in range(N)]
maxx = 0
for i in range(N):
for j in range(N):
ret = check_around(i, j)
if maxx < ret:
maxx = ret
print(maxx+1)
DP๋ฅผ ํ์ฉํด ํธ๋ ๋ฌธ์ ์๋ค. ์ฃผ๋ณ์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ๋ DP 2์ฐจ์ ๋ฐฐ์ด์ DFS๋ฅผ ์ด์ฉํด ์ฑ์๋ฃ๊ณ ์กฐํํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค.
- ๋ชจ๋ ์ขํ์ ๋ํด ์์ ํ์์ ์ค์ํ๋ค.
dp
๋ฐฐ์ด์ ํด๋น ์ขํ๊ฐ ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง ์กฐํํ๋ ๊ฒ - ๋ง์ฝ
dp
๋ฐฐ์ด์ ํด๋น ์ขํ์ ๊ฐ์ด ์๋ค๋ฉด ์ฃผ๋ณ์ ํ์ํด์ ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์+1์ ํด์ฃผ์ด์ผ ํ๋ค. ๋ง์ฝ ์ฃผ๋ณ์ ์ด๋์ด ๋ถ๊ฐ๋ฅํ๋ค๋ฉด -1์ dp์ ์ฑ์๋ฃ๋๋ค. - ์ฌ๊ท์ DP๋ฅผ ์ฌ์ฉํด์ ์ฌ์ค์ ์ํ์ข์ฐ ์ฃผ๋ณ์ ํ ๋ฒ์ฉ๋ง ์กฐํํด์ ํ์ฌ ์ขํ์์์ dp๊ฐ์ ๊ฒฐ์ ํ๋ค.
- ์ ์ฒด dp ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์์ ํ์ ์ค์
maxx
์ ๊ธฐ๋กํ์ฌmaxx+1
์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ