오른쪽위, 오른쪽 아래, 오른쪽 방향을 나타내는 dx,dy배열을 만든 후 3가지 방향을 깊이 우선 탐색으로 탐색하여 y==4의 위치 일때의 값들을 비교하여 최댓값인 것을 반환 하려고 하였다..
다이나믹이 아닌 dfs로 접근했다,, 아마 시간복잡도가 엄청날 것으로 예상된다,,
또한,,, 테스트케이스도 하나밖에 통과하지 못했다..
n,m= map(int,input().split())
arr=list(map(int,input().split()))
graph=[]
dx=[-1,1,0]
dy=[1,1,1]
#d=[[0]*n for _ in range(m)]
for i in range(0,len(arr),m):
graph.append(arr[i:m+i])
print(graph)
#d[0][0]=graph[0][0]
answer=0
def dfs(x,y,result):
global answer
for j in range(3):
nx=x+dx[j]
ny=y+dy[j]
if nx<0 or nx>=n or ny<0 or ny>=m:
continue
#print(nx,ny,result+graph[nx][ny])
if ny==3:
answer=max(result+graph[nx][ny],answer)
print(nx,ny,answer)
else:
dfs(nx,ny,result+graph[nx][ny])
return answer
temt=0
for k in range(n):
print( k,dfs(k,0,0),graph[k][0], end=",")
temt=max(dfs(k,0,0)+graph[k][0],temt)
print(temt)
왜 잘못되었는지 아직 찾지 못했다... 다시 공부하기
다이나믹 프로그래밍이 아직 익숙하지 않아 다시 공부해야한다..
=>점화식을 세워서 코드로 옮겨야한다
2차원 dp테이블에 가장 많은 금을 가지고 있는 경우를 저장
현재 시점을 기준으로 왼쪽 아래, 왼쪽 위, 왼쪽 세방향에서 온 것 중에 가장 큰 값을 dp테이블에 저장한다.
n,m= map(int,input().split())
arr=list(map(int,input().split()))
dp=[]
for i in range(0,len(arr),m):
dp.append(arr[i:m+i])
#y=0인 열 제외하고 탐색
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,left_down,left_up)
result=0
for i in range(n):
result=max(result,dp[i][m-1])
print(result)
처음 했던 방법에서 내가 각 테이블에 값을 저장하지 않으려는 이유가 계속 최댓값으로 업데이트한다면 수가 계속 커질 것이라고 생각 했기 때문이다
이 방법으로도 한번 풀어보자,,, 난 빡대가리니까,,,