解法一:(递归)
max_sum(i,j)用来计算D[i][j]到底边最长路径之和。用一个数组MaxSum[i][j]存储D[i][j]到底边最长路径之和,避免重复计算,初始值是-1。根据递归的原理,递归的条件是:MaxSum[i][j] = max(max_sum(i+1,j),max_sum(i+1,j+1)) + D[i][j];
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAX 101
int D[MAX][MAX]; //存储(i,j)元素的值
int MaxSum[MAX][MAX]; //存储D[i][j]到底边最长路径之和,避免重复计算,初始值是-1
int max_sum(int i,int j); //计算D[i][j]到底边最长路径之和
int n; //三角形行数
int max_sum(int i,int j)
{
if(MaxSum[i][j] != -1)
{
return MaxSum[i][j]; //不用进行后续计算,避免重复计算
}
if(i == n)
{
MaxSum[i][j] = D[i][j];
return MaxSum[i][j];
}
//递归
int x = max_sum(i+1,j);
int y = max_sum(i+1,j+1);
MaxSum[i][j] = max(x,y) + D[i][j];
return MaxSum[i][j];
}
int main()
{
cin >> n;
int i,j;
for(i = 1;i <= n;i++) //i,j下标从1开始
{
for(j = 1;j <= i;j++)
{
cin >> D[i][j];
MaxSum[i][j] = -1; //MaxSum[i][j]初始化为-1
}
}
cout << max_sum(1,1) << endl;
return 0;
}
解法二:(动态规划)
利用了滚动数组,节省了空间
#include <algorithm>
#include <cmath>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int MaxSum[MAX][MAX];
int main()
{
int n,i,j;
cin >> n;
for(i = 1;i <= n;i++)
for(j = 1;j <= i;j++)
cin >> D[i][j];
for(i = 1;i <= n;i++)
MaxSum[n][i] = D[n][i];
for(i = n-1;i >= 1;i--)
for(j = 1;j <= i;j++)
MaxSum[i][j] = max(MaxSum[i+1][j],MaxSum[i+1][j+1]) + D[i][j];
cout << MaxSum[1][1] << endl;
return 0;
}