动态规划--三角形问题

这是动态规划很经典的一个问题
就是一个三角形类似这样:
 2
3 4

输出顶点的到底部的最大和,限制条件元素只能左下或者右下走
例如:上述这个三角形,这个输出就是6

解决方法:动态规划

定义的dp数组的小只需要和最后一行的元素个数相等即可。例如最后一行输入的数据最后一行是10个元素,我就只需要定义一个dp[10]。

  • 首先我们可以用一个二维数组来存储这个三角形

  • 那么第一行就是一个元素,第n行就是n个元素

  • 然后我们遍历每一行的时候就用dp数组来存储本行的最大值,例如最后一行的元素它们本身,然后倒数第二行就是Max(dp[j]+triangle[i][j] , dp[j+1]+triangle[i][j])。这个找个例子就好理解

  • 从最底层开始往上就比较容易理解啦

例子:
2
3 4
5 6 4

这里有这样一个三角形,那么我的dp数组的初值分别为5 6 4

然后我们遍历到倒数第二行我们的dp数组就更新为max(5+3,6+3) max(4+6,4+4)即9 10最后一个元素不用管它,然后我们遍历最后一行更新dp为12,dp[0]就是我们想要的数据了!


#include <iostream>
using namespace std;
int dp[10];
int Max(int x,int y);
//求出x,y点到三角形底端的一条累加和最大的路径 
int Slove(int x,int y,int triangle[10][10],int n){
	for(int i=n-1;i>=0;i--){
		for(int j=0;j<=i;j++){
			//当处于第n行时,即最后一行时直接赋值
			if(i==n-1) dp[j] = triangle[n-1][j];
			// 处于其他行时就是从它左边上来的最大值加上他自己和它右边上来的最大值加它自己之间的最大值咯
			else dp[j] = Max(dp[j]+triangle[i][j] , dp[j+1]+triangle[i][j]);
		}
	}
	
	return dp[0];
} 

int Max(int x,int y){
	if(x>y) return x;
	return y;
}

int main(){
	int triangle[10][10] = {0};
	int n;
	cin >> n;
	// n行数据,每行数据个数递增1 
	for(int i=0;i<n;i++){
		for(int j=0;j<=i;j++){
			cin>>triangle[i][j];
		}
	}
	cout << Slove(1,1,triangle,n); 
	return 0;
}

不懂的话可以直接我哦!小菜鸡帮你解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值