[ACM_动态规划] 数字三角形(数塔)

递归方法解决数塔问题
状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]}
注意:1\d[i][j]表示从i,j出发的最大总和;2\变界值设为0;3\递归变界为n;4\结果为d[1][1]
#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]<<'\n';  //输出
    }
}
View Code

 

posted @ 2013-07-27 09:59  beautifulzzzz  阅读(1013)  评论(2编辑  收藏  举报