码迷,mamicode.com
首页 > 其他好文 > 详细

数字保龄球01

时间:2020-05-19 17:58:54      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:直接   namespace   std   ios   algo   include   哈哈哈   一个   pre   

题目:
第一行输入一个数字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

标签:直接   namespace   std   ios   algo   include   哈哈哈   一个   pre   

原文地址:https://www.cnblogs.com/lwyy1223-/p/12918169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!