参考程序:
#includeusing namespace std;
int a[1010][1010],ans=0;
int n;//输入数塔层数n
void dfs(int x,int y,int curr)
{
if(x==n)
{
if(curr>ans) ans=curr;
return ;
}
dfs(x+1,y,curr+a[x+1][y]);
dfs(x+1,y+1,curr+a[x+1][y+1]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
dfs(1,1,a[1][1]);
cout<
此方法实际把所有的路径都走了一遍,由于每条路径有n-1步组成,每一步有左下,右下两种选择,路径总数为2n-1时间复杂度为O(2n-1),
方法二:记忆化搜索
方法一有严重的问题,当n比较大时会花费太多时间,因为它进行了重复的搜索。如一条路径为13-11-12-6-12,另一条为13-11-12-6-7,对于11,12,6这些点进行了重复的搜索。我们完全可以在第一次搜索这些点时,就将这些点到终点的最大权值和记录下来ÿ