Triangle
2015-11-01 19:22
323 查看
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
The minimum path sum from top to bottom is
11).
Note:
Bonus point if you are able to do this using only O(n)
extra space, where n is the total number of rows in the triangle.
dp:
2-dimension array, O(n^2) extra space
[cpp] view
plaincopyprint?
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = triangle.size();
int col = triangle[row-1].size();
int ** dp = new int*[row];
for(int i = 0; i < row; i++)
dp[i] = new int[col];
dp[0][0] = triangle[0][0];
for(int i = 1; i < row; ++i){
int vlen = triangle[i].size();
for(int j = 0; j < vlen; ++j){
if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][0];
else if(j == vlen-1) dp[i][j] = dp[i-1][vlen-2] + triangle[i][vlen-1];
else{
dp[i][j] = dp[i-1][j-1] < dp[i-1][j] ? dp[i-1][j-1] : dp[i-1][j];
dp[i][j] += triangle[i][j];
}
}
}
int min = dp[row-1][0];
for(int j = 1; j < col; j++)
if(min > dp[row-1][j]) min = dp[row-1][j];
for(int i = 0; i < row; ++i)
delete[] dp[i];
delete[] dp;
return min;
}
dp:
1-dimension array, O(n) extra space
row is equal to col, right?
[cpp] view
plaincopyprint?
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = triangle.size();
int col = triangle[row-1].size();
int* dp = new int[col];
dp[0] = triangle[0][0];
for(int i = 1; i < row; ++i){
int tmp;
int vlen = triangle[i].size();
for(int j = 0; j < vlen; ++j){
if(j==0) { tmp = dp[0]; dp[j] = dp[0] + triangle[i][0];}
else if(j == vlen-1) dp[j] = tmp + triangle[i][vlen-1];
else{
int res = tmp < dp[j] ? tmp : dp[j];
res += triangle[i][j];
tmp = dp[j];
dp[j] = res;
}
}
}
int min = dp[0];
for(int j = 1; j < col; j++)
if(min > dp[j]) min = dp[j];
delete[] dp;
return min;
}
For example, given the following triangle
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
The minimum path sum from top to bottom is
11(i.e., 2 + 3 + 5 + 1 =
11).
Note:
Bonus point if you are able to do this using only O(n)
extra space, where n is the total number of rows in the triangle.
dp:
2-dimension array, O(n^2) extra space
[cpp] view
plaincopyprint?
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = triangle.size();
int col = triangle[row-1].size();
int ** dp = new int*[row];
for(int i = 0; i < row; i++)
dp[i] = new int[col];
dp[0][0] = triangle[0][0];
for(int i = 1; i < row; ++i){
int vlen = triangle[i].size();
for(int j = 0; j < vlen; ++j){
if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][0];
else if(j == vlen-1) dp[i][j] = dp[i-1][vlen-2] + triangle[i][vlen-1];
else{
dp[i][j] = dp[i-1][j-1] < dp[i-1][j] ? dp[i-1][j-1] : dp[i-1][j];
dp[i][j] += triangle[i][j];
}
}
}
int min = dp[row-1][0];
for(int j = 1; j < col; j++)
if(min > dp[row-1][j]) min = dp[row-1][j];
for(int i = 0; i < row; ++i)
delete[] dp[i];
delete[] dp;
return min;
}
dp:
1-dimension array, O(n) extra space
row is equal to col, right?
[cpp] view
plaincopyprint?
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = triangle.size();
int col = triangle[row-1].size();
int* dp = new int[col];
dp[0] = triangle[0][0];
for(int i = 1; i < row; ++i){
int tmp;
int vlen = triangle[i].size();
for(int j = 0; j < vlen; ++j){
if(j==0) { tmp = dp[0]; dp[j] = dp[0] + triangle[i][0];}
else if(j == vlen-1) dp[j] = tmp + triangle[i][vlen-1];
else{
int res = tmp < dp[j] ? tmp : dp[j];
res += triangle[i][j];
tmp = dp[j];
dp[j] = res;
}
}
}
int min = dp[0];
for(int j = 1; j < col; j++)
if(min > dp[j]) min = dp[j];
delete[] dp;
return min;
}
相关文章推荐
- 机器学习(十四)SVM总结
- 统一管理程序异常
- SpringIOC_对象的多实例和单实例
- NSCalendar
- Timer与TimerTask的真正原理&使用介绍
- HDU 5510 KMP
- K-means聚类算法
- UML第八集
- UML图概况
- [BZOJ1878] [SDOI2009]HH的项链
- 嵌入式linux学习笔记(一)
- ios新手必看之手势
- 端口转发、重定向工具 rinetd
- UICollectionView
- 信息安全系统设计基础第七周期中总结
- 日本超人气洛比(Robi)声控机器人
- C练习小代码-20151012
- RANSAC笔记
- Set Up Apache2 With mod_fcgid And PHP5 On CentOS
- UML之对象图