<입력 예시>
2
3 4
1 3 3 2 2 1 4 1 0 6 4 7
4 4
1 3 1 5 2 2 4 1 5 0 2 3 0 6 1 2
<출력 예시>
19
16
[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]
[2][0] [2][1] [2][2] [2][3]
[3][0] [3][1] [3][2] [3][3]
[0][0]은 [0][1], [1][1]을 갈 수 있다.
[1][0]은 [0][1], [1][1], [2][1]을 갈 수 있다.
이런식으로 첫번째 행 4개의 값들이 가는 곳을 둘러봐야한다.
#include <iostream>
#include <algorithm>
using namespace std;
int T, test_case, n, m, maxNum, leftUp, justLeft, leftDown;
int dp[20][20];
int main() {
cin >> T;
for (test_case = 0; test_case < T; test_case++) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> dp[i][j];
}
}
for (int j = 1; j < m; j++) {
for (int i = 0; i < n; i++) {
// 왼쪽 위에서 오는 경우
if (i == 0) leftUp = 0;
else leftUp = dp[i - 1][j - 1];
// 왼쪽 아래서 오는 경우
if (i == n - 1) leftDown = 0;
else leftDown = dp[i + 1][j - 1];
// 그냥 왼쪽
justLeft = dp[i][j - 1];
dp[i][j] += max(leftUp, max(justLeft, leftDown));
}
}
int result = 0;
for (int i = 0; i < n; i++) {
result = max(result, dp[i][m - 1]);
}
cout << result << "\n";
}
}