题目描述
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
解题思路
- 从题目中我们可以知道A[i - 1][n] 和A[i][n] , A[i][n+1]相邻
- 因此从题目概述中可以写出状态转移方程
dp(i, j)表示在第i层(从上往下)的第j个元素中的最短路径和
dp(i,j)=mindp[i−1][j−1]+A[i][j],dp[i−1][j]+A[i][j](1<=j<=i−1)
dp(i,j)=dp[i−1][j]+A[i][j](j=0),dp(i,j)=dp[i−1][j]+A[i][j−1](j=i−1) - 答案为min{dp[n-1][j]}, 0<=j<=i
public:
int minimumTotal(vector<vector<int>>& triangle) {
if (triangle.empty() || triangle[0].empty()) return 0;
int n = triangle.size();
int dp[n][n];
int M = 0x01000000;
memset(dp, 0, sizeof(dp));
dp[0][0] = triangle[0][0];
for (int i = 1; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) {
dp[i][j] = dp[i - 1][j] + triangle[i][j];
}
else if (j == i) {
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
}
else {
dp[i][j] = min(dp[i - 1][j - 1] + triangle[i][j], dp[i - 1][j] + triangle[i][j]);
}
}
}
for (int i = 0; i < n; i++) {
M = M > dp[n - 1][i]? dp[n - 1][i]: M;
}
return M;
}
};