(i, j)의 위치에 있는 값은 위치의 위쪽 혹은 왼쪽 값 중 더 큰 값을 자신과 합한 값으로 정해진다. 각각의 값들은 각각의 해당 위치까지의 최대합이 기록되기 위해 과정을 반복한다.
재귀적 해법의 경우에는 반복되는 과정에서 같은 함수가 여러번 호출되고 다이나믹 프로그래밍의 경우에는 한번 계산된 결과는 필요시 재사용되므로 재호출이 일어나지 않는다.
행렬 경로 문제 : 재귀적 알고리즘 (효율성 측면에서 부적합)
maxSum(i, j) {
if (i = 0 or j = 0) then return 0;
else return (m[i, j] + (max(maxSum(i - 1, j), maxSum(i, j - 1))));
}
print(maxSum(n, n))
행렬 경로 문제 : 다이나믹 프로그래밍
for i ← 0 to n
maxSum[i, 0] ← 0;
for j ← 1 to n
maxSum[0, j] ← 0;
for i ← 1 to n
for j ← 1 to n
maxSum[i, j] ← m[i, j] + max(maxSum[i-1, j], maxSum[i, j-1]);
print(maxSum[n, n]);
# Θ(n^2)