题解 | 三角形最小路径和

三种解法:

(1)递归(超时)

 int minroad(vector<vector<int> >& triangle, int i, int j)
     {
         if(i==(triangle.size()-1)) return triangle[i][j];
         else
             return triangle[i][j] + min(minroad(triangle,i+1,j), minroad(triangle,i+1,j+1));   
     }

     int minTrace(vector<vector<int> >& triangle) {
         return minroad(triangle,0,0);
     }

如果采用递归的方法,深度遍历每条路径,存在大量重复计算,时间复杂度为O(2^n)。

(2)递归形式的动态规划

     int minroad(vector<vector<int>> &triangle, vector<vector<int>> &minsum, int i, int j)
     {
         if(minsum[i][j]!=-1) return minsum[i][j]; 
	     if(i == triangle.size()-1) minsum[i][j] = triangle[i][j];
	     else
	     {
		     minsum[i][j] = triangle[i][j] + 					                     min(minroad(triangle,minsum,i+1,j),minroad(triangle,minsum,i+1,j+1));
	     }
	     return minsum[i][j]; 
     }
     int minTrace(vector<vector<int> >& triangle) {
         vector<vector<int>> minsum;
	   // 将minsum中的值全部置为-1
         for(auto iter=triangle.begin();iter!=triangle.end();iter++)
         {
             minsum.push_back(vector<int> (iter->size(),-1));
         }
         return minroad(triangle,minsum,0,0);
     }

每算出一个minroad就保存在minsum[i][j]里面,避免重复计算。

(3)递推形式的动态规划

    int minTrace(vector<vector<int> >& triangle)
    {
        for(int i = triangle.size() - 2; i >= 0; i-- )
        {
            for(int j = 0; j < triangle[i].size(); j++)
            {
                triangle[i][j] += min(triangle[i+1][j],triangle[i+1][j+1]);
            }
        }
        return triangle[0][0];
    }

自底向上。

全部评论

相关推荐

爱吃烤肠的牛油最喜欢...:50K是ssp了估计,ssp的人家多厉害都不用说,每年比例大概在百分之5左右
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务