Triangle

来源:互联网 发布:淘宝支点运动是真的吗 编辑:程序博客网 时间:2024/05/01 17:00

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

[     [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?
  1. int minimumTotal(vector<vector<int> > &triangle) {  
  2.         // Start typing your C/C++ solution below  
  3.         // DO NOT write int main() function  
  4.         int row = triangle.size();  
  5.         int col = triangle[row-1].size();  
  6.           
  7.         int ** dp = new int*[row];  
  8.         for(int i = 0; i < row; i++)  
  9.             dp[i] = new int[col];  
  10.               
  11.         dp[0][0] = triangle[0][0];  
  12.         for(int i = 1; i < row; ++i){  
  13.             int vlen = triangle[i].size();  
  14.             for(int j = 0; j < vlen; ++j){  
  15.                 if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][0];  
  16.                 else if(j == vlen-1) dp[i][j] = dp[i-1][vlen-2] + triangle[i][vlen-1];  
  17.                 else{  
  18.                     dp[i][j] = dp[i-1][j-1] < dp[i-1][j] ? dp[i-1][j-1] : dp[i-1][j];  
  19.                     dp[i][j] += triangle[i][j];  
  20.                 }  
  21.             }  
  22.         }  
  23.         int min = dp[row-1][0];  
  24.         for(int j = 1; j < col; j++)  
  25.             if(min > dp[row-1][j]) min = dp[row-1][j];  
  26.               
  27.         for(int i = 0; i < row; ++i)  
  28.             delete[] dp[i];  
  29.         delete[] dp;  
  30.         return min;  
  31.     }  

dp:

1-dimension array, O(n) extra space

row is equal to col, right?

[cpp] view plaincopyprint?
  1. int minimumTotal(vector<vector<int> > &triangle) {  
  2.         // Start typing your C/C++ solution below  
  3.         // DO NOT write int main() function  
  4.         int row = triangle.size();  
  5.         int col = triangle[row-1].size();  
  6.           
  7.         int* dp = new int[col];  
  8.           
  9.         dp[0] = triangle[0][0];  
  10.         for(int i = 1; i < row; ++i){  
  11.             int tmp;  
  12.             int vlen = triangle[i].size();  
  13.             for(int j = 0; j < vlen; ++j){  
  14.                 if(j==0) { tmp = dp[0]; dp[j] = dp[0] + triangle[i][0];}  
  15.                 else if(j == vlen-1) dp[j] = tmp + triangle[i][vlen-1];  
  16.                 else{  
  17.                     int res = tmp < dp[j] ? tmp : dp[j];  
  18.                     res += triangle[i][j];  
  19.                     tmp = dp[j];  
  20.                     dp[j] = res;                      
  21.                 }  
  22.             }  
  23.         }  
  24.           
  25.         int min = dp[0];  
  26.         for(int j = 1; j < col; j++)  
  27.             if(min > dp[j]) min = dp[j];  
  28.           
  29.         delete[] dp;  
  30.         return min;  
  31.     }  
0 0