问题描述: 给定一个有n行数字组成的数字三角形. 试设计一个算法, 计算出从三角形的顶至底的一条路径, 使该路径经过的数字和最大.
算法设计: 对于给定的n行数字组成的三角形, 计算从三角形顶至底的路径经过的数字和的最大值.
数据输入: 第1行数字三角形的行数n, 1<=n<=100. 接下来n行是数字三角形各行中的数字. 所有数字在0~99之间.
结果输出: 第1行中的数是计算出的最大值.
样例
输入(1)
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出(1)
30
代码
#include <iostream>
using namespace std;
const int N=1500;
int a[N][N];
int f[N][N]; //记录从上到下的累加和
int ans=0;
int n;
int dfs(int x,int y){
//记忆搜索, 避免进一步递归
if(f[x][y]!=0) return f[x][y]; //由于开全局数组初始化都为0不为零就相当于已经搜索过就记录下来
if(x==n-1) //边界条件
f[x][y]=a[x][y];
else
f[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
return f[x][y];
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cin>>a[i][j];
}
}
dfs(0,0);
cout<<f[0][0]<<endl;
return 0;
}