递归方法解决数塔问题
状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]}
注意:1d[i][j]表示从i,j出发的最大总和;2变界值设为0;3递归变界为n;4结果为d[1][1]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> using namespace std; #define maxn 1000+5 int n; int a[maxn][maxn]; int d[maxn][maxn]; int D(int i,int j){ //递归解决状转移方程 return a[i][j]+(i==n ? 0:max(D(i+1,j),D(i+1,j+1))); } int main(){ for(;cin>>n && n;){ //输入及d的初始化 memset(d,0,sizeof(d)); int i,j; for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ cin>>a[i][j]; } } for(i=1;i<=n;i++){ //求d[][] for(j=1;j<=i;j++){ d[i][j]=D(i,j); } } cout<<d[1][1]<<' '; //输出 } }