//运用全递归的话,那样造成大量的重复计算,时间复杂度为2的n次方,太大了
//递归如下
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int n;
int nums[MAX][MAX];//定义两个二维数组
int maxsum(int i,int j)
{
if (i==n)//如果到最后一行,以为下面没有值,就直接赋值
{
return nums[i][j];
}
int x = maxsum(i+1,j);//左下角的
int y = maxsum(i + 1, j+1);//右下角的
return max(x, y) + nums[i][j];// 下面最大的加上原值
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> nums[i][j];
}
}
cout << maxsum(1,1);//从1,1位置开始
return 0;
}
//下面的算法避免重复计算(动态规划)
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int n;
int nums[MAX][MAX];//定义两个二维数组
int sux[MAX][MAX];//储存最大相加后的的值
int maxsum(int i,int j)
{
if (sux[i][j]!=-1)//如果这个位置已经储存过最大值了,就直接返回这个值,这样就避免了重复计算
{
return sux[i][j];
}
if (i==n)//如果到最后一行,以为下面没有值,就直接赋值
{
sux[i][j] = nums[i][j];
}
else
{
int x = maxsum(i+1,j);//左下角的
int y = maxsum(i + 1, j+1);//右下角的
sux[i][j] = max(x, y) + nums[i][j];// 下面最大的加上原值
}
return sux[i][j];
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> nums[i][j];
sux[i][j] =-1;//将每个位置上的值赋值为-1
}
}
cout << maxsum(1,1);//从1,1位置开始
return 0;
}
//下面的节省空间,不省时间
//不再用数组
#include<iostream>
#include<algorithm>
#define MAX 101
int n;
int nums[MAX][MAX];//定义两个二维数组
using namespace std;
int *maxsum;
int main()
{
cin >> n;
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
cin >> nums[i][j];
}
}
maxsum = nums[n];
for (int i = n - 1; i >= 1; i--)
{
for (int j = 1; j <= i; j++)
{
maxsum[j]= max(maxsum[j], maxsum[j + 1]) + nums[i][j];
}
}
cout << maxsum[1];
return 0;
以上内容来自中国大学mooc课程