-정답 풀이:
하나의 위치는(i,j) 왼쪽(i,j-1), 왼쪽 위(i-1,j-1), 왼쪽 아래(i+1,j-1)의 숫자들로부터 온다. 그래서 이 숫자들 중에 최댓값을 (i,j)에 저장하면서 누적한다
점화식
dp[i][j]=array[i][j] + max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])
t=int(input())
for _ in range(t):
n,m=map(int,input().split())
data=list(map(int,input().split()))
dp=[[] for _ in range(n)]
ans=0
for i in range(n):
for j in range(i*m,(i+1)*m):
dp[i].append(data[j])
for j in range(1,m):
for i in range(n):
if i==0:
left_up=0
else:
left_up=dp[i-1][j-1]
if i==n-1:
left_down=0
else:
left_down=dp[i+1][j-1]
left=dp[i][j-1]
dp[i][j]=dp[i][j]+max(left_up,left_down,left)
for i in range(n):
ans=max(ans,dp[i][m-1])
print(ans)
-내 풀이
여기서 오류. 문제는 한 위치에서 오른쪽 위,옆,아래로만 이동할 수 있는데 내가 쓴 풀이로 하면 이 범주를 넘어가게 연산이 돼서 틀린 답이 출력된다
따라서 점화식으로 진행해야한다
t=int(input())
for _ in range(t):
n,m=map(int,input().split())
ans=0
dp=[[] for _ in range(n)]
data=list(map(int,input().split())
cnt=0
for i in range(n):
for j in range(i*m,(i+1)*m):
dp[i].append(data[j])
for j in range(m):
for i in range(n):
cnt=max(dp[i][j],cnt)
ans+=cnt
cnt=0
print(ans)
'코딩테스트 > 기출' 카테고리의 다른 글
[dp/Goldman Sachs] 편집 거리 (0) | 2022.05.27 |
---|---|
[dp/구글 인터뷰] 못생긴 수(다시) (0) | 2022.05.27 |
[프로그래머스/이진탐색] 가사 검색 (0) | 2022.05.25 |
[프로그래머스/dfs] 600048번: 괄호 변환 (0) | 2022.05.06 |
[카카오] 프로그래머스: 60062번 (0) | 2022.05.03 |