标签:直接 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
#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数组中,然后在比较相邻数字的大小,用最大的数字相加上一行的数字然后保存;
标签:直接 namespace std ios algo include 哈哈哈 一个 pre
原文地址:https://www.cnblogs.com/lwyy1223-/p/12918169.html