时间限制: 1Sec 内存限制: 128MB
题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。
输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
输出
输出每次测试的最大值并且占一行。
样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
Code
方法
1、递归,非常直接暴力
Code1:暴力递归
缺点:十分浪费时间
自上往下递归:时间复杂度O(n)=n2
因为中间存在大量相同的递归函数,解决办法就是记忆化递归
即:
创建一个相同大小的数组(其实可以少一行),赋某一个关键值用来判断当前位置是否已经得到中间最大值
进行递归判断的时候可以用这个数组的值作为终止递归的判断条件。
#include<stdio.h>
#include<string.h>
int ta[100][100] = {
1 };
int Func(int i,int j,int n)
{
if (i==n-1) return ta[i][j];//最底层
int left=0, right=