best = copy of the last row; for rows from second-last up, best[i] = row[i] + min(best[i], best[i + 1]). Answer best[0].
Approach 1
import java.util.*;
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[] best = new int[n + 1];
for (int r = n - 1; r >= 0; r--)
for (int i = 0; i <= r; i++)
best[i] = triangle.get(r).get(i) + Math.min(best[i], best[i + 1]);
return best[0];
}
}