数字保龄球01

Posted lwyy1223-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字保龄球01相关的知识,希望对你有一定的参考价值。

题目:
第一行输入一个数字n,代表这个数字三角形一共有几行;
接下来的n行,第i行输入i个数字;//例如第三行就输入三个数字
然后寻找一条从顶部到底边的路径,是的路径上所经过的数字之和最大,路径上的每一步只能往左下走或者右下走;求出最大和。不必给出具体路径,三角形行数大于1小于100,数字为0到99;

输入例子:(自行脑补为三角形,哈哈哈)
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出:
30

1.记忆递归型

#include <iostream>
#include <conio.h>
#include <cstdio>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;

#define MAX 101

int aa[MAX][MAX];
int n;
int maxans[MAX][MAX];

int maxsum(int i, int j)
{
	if (maxans[i][j] != -1)
		return maxans[i][j] = aa[i][j];
	if (i == n)
		maxans[i][j] = aa[i][j];
	else
	{
		int a = maxsum(i + 1, j);
		int b = maxsum(i + 1, j + 1);
		maxans[i][j] = max(a,b) + aa[i][j];
	}
	return maxans[i][j];
}

int main()
{
	int i, j;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= i; j++)
		{
			cin >> aa[i][j]; maxans[i][j]=-1;
		}
	}
	cout << maxsum(1, 1) << endl;
}

2.递推型

//递推型
int main()
{
	int i, j;
	int n;
	int maxans[MAX][MAX];
	int aa[MAX][MAX];
	cin >> n;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= i; j++)
			cin >> aa[i][j];
	for (i = 1; i <= n; i++)
		maxans[n][i] = aa[n][i];
	for (i = n - 1; i >= 1; i--)
		for (j = 1; j <= i; j++)
			maxans[i][j] = max(maxans[i + 1][j], maxans[i + 1][j + 1]) + aa[i][j];
	cout << maxans[1][1] << endl;
}

解析:
将最后一排数字直接复制到maxans数组中,然后在比较相邻数字的大小,用最大的数字相加上一行的数字然后保存;

以上是关于数字保龄球01的主要内容,如果未能解决你的问题,请参考以下文章

404是啥意思污知识

RUBY:使用结构数组 [关闭]

Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发

Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发

Unity3D OpenVR 虚拟现实 保龄球打砖块游戏开发

保龄球计分