1、直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算”
#include<iostream> #include<algorithm> using namespace std; #define maxn 1000+5 int n; int a[maxn][maxn]; int d[maxn][maxn]; int main(){ for(;cin>>n && n;){ 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(j=1;j<=n;j++){ //计算最底层d[][]值 d[n][j]=a[n][j]; } for(i=n-1;i>=1;i--){ //从下向上计算d[][]值 for(j=1;j<=i;j++){ d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]); } } cout<<d[1][1]<<'\n'; } }