三角形问题——(递归,递推,动态规划)

本文详细介绍了使用递归、带记忆的递归以及动态规划三种方法来求解三角形网格中从顶点到底部的最大路径和。通过具体的代码实现,展示了如何避免重复计算并优化空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 用递归的方法来解决这个问题

2. 带记忆的递归(将那些已经计算过的点直接返回值)这里递归的时候,将那些计算过在它之下的最大路径的值保存起来,下次

   再用的时候直接查看就可以了

#include<iostream>
#include <vector>
#include <string>
using namespace std;

#define MAXLINE 100
int vec[MAXLINE][MAXLINE];
int maxsum[MAXLINE][MAXLINE];
int ifmaxsum[MAXLINE][MAXLINE];

#define N 4

int max_sum(int a,int b)
{
	if(a>=b)
		return a;
	else
		return b;
}
int big_sum(int i,int j)
{
	if(i==N)
		return vec[i][j];
	return max_sum(big_sum(i+1,j),big_sum(i+1,j+1))+vec[i][j];	
}

//2. 带记忆的递归(将那些已经计算过的点直接返回值)
//这里递归的时候,将那些计算过在它之下的最大路径的值保存起来,下次
//再用刀的时候直接查看就可以了。
int big_sum1(int i,int j)
{
	if(ifmaxsum[i][j]==-1)
		return maxsum[i][j];
	if(i==N)
		return vec[i][j];
	else
	{
		int x,y;
		x=big_sum1(i+1,j);
		y=big_sum1(i+1,j+1);
		maxsum[i][j]=max_sum(x,y)+vec[i][j];
		ifmaxsum[i][j]=-1;
		return maxsum[i][j];
	}
}
int main()
{
	vec[0][0]=7;
	vec[1][0]=3,vec[1][1]=8;
	vec[2][0]=8,vec[2][1]=1;vec[2][2]=0;
	vec[3][0]=2,vec[3][1]=7,vec[3][2]=4,vec[3][3]=4;
	vec[4][0]=4,vec[4][1]=5,vec[4][2]=2,vec[4][3]=6,vec[4][4]=5;

	cout<<big_sum(0,0)<<endl;
	cout<<big_sum1(0,0)<<endl;
}

3. 从最下面的一行开始往上面求最大值,这样可以一直往上面递推来求最大路径值

4. 空间的优化,没一行求完之后就没有用了,可以只用一行数组

#include<iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;

#define MAXLINE 100
int vec[MAXLINE][MAXLINE];


//从最下面的一行开始往上面求最大值,这样可以一直往上面递推来求最大路径值
int DiTui(int vec[][MAXLINE],int n)
{
	int temp[MAXLINE][MAXLINE];
	if(n==1)
		return vec[0][0];

	for(int j=0;j<=n-1;j++)
		temp[n-1][j]=vec[n-1][j];
	for(int i=n-2;i>0;i--)
		for(int j=0;j<=i;j++)
			temp[i][j]=max(temp[i+1][j],temp[i+1][j+1])+vec[i][j];
	return vec[0][0]+max(temp[1][0],temp[1][1]);
}
//空间的优化,没一行求完之后就没有用了,可以只用一行数组
int DiTui1(int vec[][MAXLINE],int n)
{
	int temp[MAXLINE];
	if(n==1)
		return vec[0][0];
	for(int j=0;j<=n-1;j++)
		temp[j]=vec[n-1][j];
	for(int i=n-2;i>0;i--)
		for(int j=0;j<=i;j++)
			temp[j]=max(temp[j],temp[j+1])+vec[i][j];
	return vec[0][0]+max(temp[0],temp[1]);
}

int main()
{
	vec[0][0]=7;
	vec[1][0]=3,vec[1][1]=8;
	vec[2][0]=8,vec[2][1]=1;vec[2][2]=0;
	vec[3][0]=2,vec[3][1]=7,vec[3][2]=4,vec[3][3]=4;
	vec[4][0]=4,vec[4][1]=5,vec[4][2]=2,vec[4][3]=6,vec[4][4]=5;

	cout<<DiTui(vec,5)<<endl;
	cout<<DiTui(vec,5)<<endl;
}

  

 

转载于:https://www.cnblogs.com/yanliang12138/p/4513007.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值