2차원 DP를 이용하여 푸는 전형적인 문제입니다. 준규는 오른쪽, 아래, 대각선으로 이동할 수 있지만 대각선은 이동할 필요가 없습니다.
왜냐하면, 문제에서 요구하는 것은 최대로 먹을 수 있는 사탕의 개수이기 때문입니다. 그래서 DP를 계산할 때 한칸 위, 한칸 왼쪽만 보시면 됩니다.
그래서 2차원 DP를 만들고 자리에 도착했을때 최대로 먹을 수 있는 사탕의 개수를 갱신하면 됩니다. 점화식은 다음과 같습니다.
dp[i][j] = max(dp[i-1][j] + dp[i][j-1]) + (i,j) 사탕 수
그리고 다음과 같이ex) i-1 범위의 핸들링이 필요할 경우 DP의 크기를 +1씩 해주시면 편합니다.
n, m = map(int, input().split())
dp = [[0] * (m + 1) for _ in range(n + 1)]
graph = []
for _ in range(n):
graph.append(list(map(int, input().split())))
# dp 채우기
for i in range(1, n + 1):
for j in range(1, m + 1):
# 위, 왼쪽 중 큰값
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + graph[i - 1][j - 1]
print(dp[n][m])