数塔问题

/*
	Name: 数塔问题 
	Copyright: free
	Author: 巧若拙 
	Date: 24-07-17 09:55
	Description: 数塔问题 :
	要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
	13
	11 8
	12 7 26
	6 14 15 8
	12 7 13 24 11
	算法思路:典型的动态规划,可以从上往下走,但是最终需要遍历最底层,找出最大值。
	更巧妙的方法是从右下角斜向上走,最终到达顶点,刚好得到答案。
	还可以利用上下层之间数值的关系,得到路径。 
*/
#include<iostream>
#include<cstdio>

using namespace std;

const int MAX = 100; 
int map[MAX][MAX];

int DP(int n);
void PrintPath(int n);

int main() 
{
	int n;
	cin >> n;
	for (int i=0; i<n; i++)
	{
		for (int j=0; j<=i; j++)
		{
			cin >> map[i][j];
		}
	}
	
	cout << DP(n) << endl;
	PrintPath(n);
	
    return 0;
}

int DP(int n) 
{
	for (int i=n-2; i>=0; i--) //从右下角斜向上走,最终到达顶点,刚好得到答案
	{
		for (int j=i; j>=0; j--) 
		{
			map[i][j] += max(map[i+1][j], map[i+1][j+1]);
		}
	}
	return map[0][0];
}

void PrintPath(int n)
{
	int i = 0, j = 0;
	
	for (int k=1; k<n; k++) //输出前n-1行 
	{
		if (map[i+1][j] > map[i+1][j+1]) //向正下方走
		{
			cout << map[i][j] - map[i+1][j] << "->";
			i++;
		} 
		else //向右下方走
		{
			cout << map[i][j] - map[i+1][j+1] << "->";
			i++;
			j++;
		} 
	}
	//输出底层元素 
	cout << map[i][j] << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值