数字三角形(记忆型递归+动态规划)

数字三角形(记忆型递归+动态规划)

题目
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99
输入格式:
5
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 1000;

int D[MAX][MAX];//储存(i,j)元素的数值
int MaxSum[MAX][MAX];//储存D[i][j]到底边最长路径之和,避免重复计算,初始值为-1
int max_sum(int i, int j);//计算从D[i][j]到底边最长路径之和
int n;//三角形行数

int main()
{
	int i, j;
	cin >> n;
	for (i = 1;i <= n;i++)//i,j下标从1开始
		for (j = 1;j <= i;j++)
		{
			cin >> D[i][j];
			MaxSum[i][j] = -1;//MaxSum[i][j]初始化为-1
		}
	cout << max_sum(1,1) << endl;
}

int max_sum(int i, int j)
{
	if (MaxSum[i][j] != -1)
	{
		return MaxSum[i][j];//不用进行后续计算,避免重复计算
	}
	if (i == n)//在底边时
	{
		MaxSum[i][j] = D[i][j];
		return MaxSum[i][j];
	}
	//递归
	int x = max_sum(i + 1, j);
	int y = max_sum(i + 1, j + 1);
	MaxSum[i][j] = max(x, y) + D[i][j];
	return MaxSum[i][j];
}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页