引入小例题1 数字三角形(分析为什么不能单纯用递归思路解决)
本题用递归做看似十分简单,但递归的缺点是太慢了,特别对于本题而言,重复计算十分多。
改进:存放计算结果
动手实现:
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX]; //存放三角形矩阵
int maxsum[MAX][MAX]; //记录最大值
int n;
int Maxsum(int i, int j)
{
if(maxsum[i][j]==!-1){ //该值被记录过,直接返回记录值
return maxsum[i][j];
}
else if(i==n-1){ //我的矩阵从第0行开始 因此是n-1
return D[i][j]; //不能移动只能返回起点
}
else{
int x=Maxsum(i+1,j); //往左下角走
int y=Maxsum(i+1,j+1); //往右下角走
maxsum[i][j]=max(x,y)+D[i][j]; //记录该位置的最大权路径 取两移动中最大的和该点权重相加
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
maxsum[i][j]=-1; //初始化最大路径记录为-1
}
cout<<Maxsum(0,0)<<endl;
}
}