数字三角形

数字三角形问题

给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 要求:(1)每一步可沿左斜线向下或右斜线向下 (2)1 < 三角形行数 < 100 (3)三角形数字为0,1,…99

1
3 2
4 10 1
4 3 2 20

解法

将当前位置(i,j)看成一个状态,然后定义状态(i,j)的指标函数d(i,j)为格子(i,j)触发能得到的最大和。包含了这样的一个思想:整体最优解一定包含了局部最优解,与最短路径算法的思想是一致的。

在这里可以使用记忆化搜索,代码如下:

#include<iostream>
#include<algorithm>
#define Max 101
using namespace std;

int D[Max][Max];
int Max_Sum[Max][Max];
int num;

int solve(int i, int j)
{
	if (Max_Sum[i][j] != -1)
		return Max_Sum[i][j];
	if (i == num)
		Max_Sum[i][j] = D[i][j];
	else
		Max_Sum[i][j] = D[i][j] + max(solve(i + 1, j), solve(i + 1, j + 1));

	return Max_Sum[i][j];
}
int main()
{
	cin >> num;
	for (int i = 1; i <= num; i++)
	{
		for (int j = 1; j <=i; j++)
			cin >> D[i][j];
	}
	memset(Max_Sum, -1, sizeof(Max_Sum));
	cout << solve(1, 1) << endl;
	system("pause");
	return 0;
}

这里是利用一个D[i][j]来存储数字三角形,Max_Sum[i][j]来存储当前路径的最大值,这样可以减少复杂度。

posted @ 2018-07-08 09:59  MrYun  阅读(175)  评论(0编辑  收藏  举报