BOJ14500 테트로미노
문제
골드
테트리스 조각에 해당하는 공간만큼의 숫자를 더해서 최대값 구하기
아이디어
-
좌표를 움직이면서 4칸 움직이면 멈추면 되겠다
➡ dfs를 쓰고 depth == 4 이면 값을 계산하자! -
컷엣지방식을 써서 가지치기하자 배열의 최대값을 구하기
maxv = max(map(max,arr))
➡ 현재의 총합(sumv) + arr의 최대값(maxv) * (3 - depth)번 곲한값 <= 현재의 최대값(result) 보다 작으면 어차피 최대값 갱신 불가 따라서 리턴 -
ㅗ,ㅜ 와 같은 방식은 계속 칸을 옮기면 만들어질 수 없다
➡ 블럭이 2개가 쌓였을 경우, dc,dr값을 더해주고, 다음 dfs를 진행할 때는 현재의 좌표에서 진행한다.
코드
import sys
sys.stdin = open('BOJ14500.txt')
N,M = map(int,sys.stdin.readline().split())
arr = [list(map(int,sys.stdin.readline().split())) for _ in range(N)]
dr=[0,0,1,-1]
dc=[1,-1,0,0]
result = 0
maxval = max(map(max, arr))
def dfs(cnt,sumV,r,c):
global result
if sumV + (3-cnt) * maxval <=result:
return
if cnt ==3:
result = max(sumV,result)
return
else:
for i in range(4):
temp_r = r +dr[i]
temp_c = c +dc[i]
if 0<= temp_c < N and 0<=temp_r<M and not visit[temp_c][temp_r]:
if cnt==1:
visit[temp_c][temp_r] = 1
dfs(cnt + 1, sumV + arr[temp_c][temp_r], r, c)
visit[temp_c][temp_r]=0
visit[temp_c][temp_r]=1
dfs(cnt+1,sumV+arr[temp_c][temp_r],temp_r,temp_c)
visit[temp_c][temp_r]=0
visit = [[0] * M for _ in range(N)]
for c in range(N):
for r in range(M):
visit[c][r]=1
dfs(0,arr[c][r],r,c)
visit[c][r]=0
print(result)
Author And Source
이 문제에 관하여(BOJ14500 테트로미노), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hsngju/BOJ14500-테트로미노저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)