โจทย์
เมทริกซ์ n×n หา falling path sum น้อยที่สุด: เริ่มแถวแรกคอลัมน์ไหนก็ได้ เลือก 1 ตัวต่อแถว คอลัมน์ถัดไปต่างได้ ≤ 1
ตัวอย่าง: [[1,2,3],[4,5,6],[7,8,9]] → 12 (เส้นทาง 1→4→7)
แนวคิด: Bottom-up DP แก้ไขในเมทริกซ์เดิม
จากแถวล่างสุดขึ้นบน: dp[i][j] = matrix[i][j] + min(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1])
ขั้นตอน
n = matrix.size()- ลูป
i = n-2 ถึง 0(ขึ้นจากแถวสุดท้าย-1):- ลูป
j = 0 ถึง n-1:x1 = (j>0) ? matrix[i+1][j-1] : INFx2 = matrix[i+1][j]x3 = (j+1matrix[i][j] += min(x1, x2, x3)
- ลูป
- คืน
min ของแถวแรก
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& a) {
int n = a.size();
for (int i = n-2; i >= 0; i--) {
for (int j = 0; j < n; j++) {
int x1 = (j > 0) ? a[i+1][j-1] : INT_MAX;
int x2 = a[i+1][j];
int x3 = (j+1 < n) ? a[i+1][j+1] : INT_MAX;
a[i][j] += min({x1, x2, x3});
}
}
int ans = INT_MAX;
for (int i = 0; i < n; i++) ans = min(ans, a[0][i]);
return ans;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9}};
cout << ob.minFallingPathSum(v); // 12
return 0;
}
อินพุต / เอาต์พุต
Input: [[1,2,3],[4,5,6],[7,8,9]]
Output: 12
ความซับซ้อน
- Time: O(n²)
- Space: O(1) extra (แก้ใน matrix เดิม)