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模板,但个人认为后两者的时间效率不如前者。