LeetCode 120 三角形最小路径(方法一)

class Solution {
public:
    int dp[1000][1000];
    int minimumTotal(vector<vector<int>>& triangle) {
         //基本思想,动态规划,思路自顶向下,或自底向上,
         //先考虑自顶向下,用dp[i][j]二维数组维护,到达每个节点的最短路径,dp[i][j]=min(dp[i-1][j-1]
         //,dp[i-1][j])+triangle[i][j])
         //返回最后一行元素的最小值
         //int **dp=new int*[1000];//用来保存到第i行的最小路径
         dp[0][0]=triangle[0][0];
         int len=triangle.size();
         for(int i=1;i<len;++i){
             for(int j=0;j<triangle[i].size();++j){
                 if(j==0){
                     dp[i][j]=dp[i-1][j]+triangle[i][j];
                 }
                 else if(j==triangle[i].size()-1){
                     dp[i][j]=dp[i-1][j-1]+triangle[i][j];
                 }
                 else{
                     dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j];
                 }
             }
         }
         int minus=0xffffff;
         for(int j=0;j<triangle[len-1].size();++j){
            // printf("%d ",dp[len-1][j] );
              minus=min(minus,dp[len-1][j]);
         }
         return minus;
    }

};

  缺点:空间复杂度较高,但是针对此问题还可以对空间复杂度进行改进。另外,对于dp不仅可以使用全局变量保存(优点,均初始化为0,缺点存在浪费),也可以动态开辟数组,另外还可以使用vector模板,但个人认为后两者的时间效率不如前者。

原文地址:https://www.cnblogs.com/zzw-/p/13259866.html