[leetcode] Triangle

本文探讨了如何通过动态规划和递归方法计算三角形中从顶点到底部的最小路径和。详细解释了两种算法的原理,并通过实例展示了如何应用这些算法解决实际问题。

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.

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int min=INT_MAX;
        int n=triangle.size();
        DFS(triangle,0,0,n,0,min);
        return min;
    }
    void DFS(vector<vector<int> >& A, int depth,int p, int n , int sum, int &min){
         if(depth==n){
            if(min>sum)
                min=sum;
            return ;
         }
         DFS(A,depth+1,p,n,sum+A[depth][p],min);
         DFS(A,depth+1,p+1,n,sum+A[depth][p],min);
         return;
    }    
};

DFS递归似乎效率比较低,大数据过不了.DFS如果不用循环去实现应该是下面这个样子:

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function
		int n=triangle.size();
		int *p=new int[n];
		memset(p,0,sizeof(int)*n);
		int k=1,min=INT_MAX;
		int sum=triangle[0][0];
		if(n==1)
			return triangle[0][0];
		for( ; ; ){
			if(p[k]-p[k-1]>1){
				k--;
				if(k==0)
					break;
				sum-=triangle[k][p[k]];
				p[k]++;
				for(int i=k ; i<n-1 ; i++)
                    p[i+1]=p[i];
				continue;
			}
			if(k==n-1){
				sum+=triangle[k][p[k]];
				if(sum<min)
					min=sum;
				sum-=triangle[k][p[k]];
				p[k]++;
			}
			else{
				sum+=triangle[k][p[k]];
				k++;
			}
		}
		return min;
	}   
};

当然可以用动态规划去做:

到某一个数字的路径为到其肩膀上的两个数字路径长度的较小值加上它自身。

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function
		int n=triangle.size();
		int *path=new int[n];
		int *temp=new int[n];
		memset(path,0,n*sizeof(int));
		path[0]=triangle[0][0];
		for(int i=1 ; i<n ; i++){
			for(int k=0 ; k<i ; k++)
				temp[k]=path[k];
			for(int j=1; j<i ; j++){
				path[j]=triangle[i][j]+min(temp[j-1],temp[j]);
			}
			path[0]=temp[0]+triangle[i][0];
			path[i]=temp[i-1]+triangle[i][i];
		}
		for(int i=1 ; i<n ; i++){
			if(path[i]<path[0])
				path[0]=path[i];
		}
		return path[0];
	}
};



内容概要:本文系统梳理了2025年数学前沿领域的研究动态与发展趋势,涵盖代数几何、数论、微分几何、拓扑学、偏微分方程、数学物理等多个核心方向,并介绍了当前国际数学研究的三大主流趋势:代数几何与数论、分析与偏微分方程、几何拓扑与表示论。文中重点报道了青年数学家王虹成功证明三维挂谷猜想的重大突破,以及韦东奕在偏微分方程与几何分析方面的研究成果,展现了中国数学界的崛起态势。同时,文档还涉及数学基础研究、应用数学、数学教育、期刊评价体系及国际数学强国格局等内容,引用大量视频、文章和权威资源,呈现数学学科的全貌与发展前景。; 适合人群:具备一定数学基础的本科生、研究生及科研工作者,关注数学前沿发展的教师、科技爱好者以及从事人工智能、物理、工程等相关领域并需数学支撑的专业人士。; 使用场景及目标:①了解2025年数学领域的重要突破与研究热点,如挂谷猜想的证明、朗兰兹纲领、拓扑数据分析等;②把握数学各分支的前沿方向与交叉应用,服务于科研选题、学术规划或跨学科研究;③获取权威学习资源与经典文献推荐,辅助数学学习与教学实践。; 阅读建议:此文档为信息聚合型资料,建议结合所列视频、书籍和论文深入拓展学习,重点关注核心突破案例(如王虹、韦东奕)与主流研究方向的演进脉络,宜以批判性思维梳理知识体系,避免碎片化阅读。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值