1932번: 정수 삼각형
문제 풀이 아이디어
1. 정의
f(i, j) = i번째 줄 j번째 수까지 이어온 경로의 합의 최대값
2. 구하는 답
max(f(n, 1), f(n, 2), ..., f(n, n))
3. 초기값
f(1, 1) = matrix[0][0]
4. 점화식
f(i, j) = matrix[i][j] + max(f(i - 1, j - 1), f(i - 1, j))
코드
let n = Int(readLine()!)!
var matrix = [[Int]]()
var cache = Array(repeating: Array(repeating: -1, count: n), count: n)
for i in 0..<n {
matrix.append(readLine()!.split(separator: " ").map { Int(String($0))! } + Array(repeating: 0, count: n - i - 1))
}
func f(r: Int, c: Int) -> Int {
if r < 0 || r >= n || c < 0 || c >= n {
return 0
}
if cache[r][c] < 0 {
cache[r][c] = matrix[r][c] + max(f(r: r - 1, c: c - 1), f(r: r - 1, c: c))
}
return cache[r][c]
}
var result = 0
for c in 0..<n {
result = max(f(r: n - 1, c: c), result)
}
print(result)
Tip
- 합을 구하는 것이기 때문에 갈 수 없는 길을 예외 처리하지 않고 그냥 0을 더하면 됩니다.
- 이 때문에 초기값을 따로 넣지 않아도 자동적으로 초기값 + max(0, 0)이 되어서 자동적으로 초기값이 설정되었습니다.