hdu2084 数塔 记忆化搜索水题

来源:互联网 发布:耐克高仿淘宝店铺 编辑:程序博客网 时间:2024/06/05 23:59
数塔Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33327    Accepted Submission(s): 19904Problem Description在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗?Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。Output对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。Sample Input1573 88 1 0 2 7 4 44 5 2 6 5Sample Output30Source2006/1/15 ACM程序设计期末考试

来源: http://acm.hdu.edu.cn/showproblem.php?pid=2084

状态方程 d(i,j) = a(i,j) + max{ d(i+1,j),d(i+1,j+1) }//------------------------------------------------------非递归写法未超时---------------------------------------------------//#include <iostream>#include <cstdio>#include <map>#include <cstdlib>#include <cmath>#include <algorithm>#include <cstring>using namespace std;int A[101][101],N;int D[101][101];int Cal(int i,int j){    if(D[i][j]>=0) return D[i][j];    else return D[i][j] = A[i][j] + (i==N? 0:max(Cal(i+1,j),Cal(i+1,j+1)));}int main(){    //freopen("F:\\test.txt","r",stdin);    int T;cin>>T;    for(int i=1;i<=T;i++)    {        memset(D,-1,sizeof(D));cin>>N;        for(int j=1;j<=N;j++)            for(int k=1;k<=j;k++) cin>>A[j][k];        cout<<Cal(1,1)<<endl;    }    return 0;}
/***********************************递归写法超时|*****************************************/#include <cstdio>#include <cstring>#define high 100int A[high+1][high+1];int B[high+1][high+1];int MAX(int High,int i){    return B[High][i]>=B[High][i+1]?B[High][i]:B[High][i+1];}int Cal(int High){    for(int i=1;i<=High;i++)        B[High][i]=(MAX(High+1,i)+A[High][i]);    if(High==1)  return B[1][1];//顶部边界    else         return Cal(High-1);}int Handle(int N){    for(int i=1;i<=N;i++)        for(int j=1;j<=i;j++) scanf("%d",&A[i][j]);    for(int i=1;i<=N;i++) B[N][i]=A[N][i];//设置边界    return Cal(N-1);//从第倒数第二层向下找}int main(){    int T;scanf("%d",&T);    for(int i=1,N;i<=T&&scanf("%d",&N);i++)    {        printf("%d\n",Handle(N));       /* for(int i=1;i<=N;i++)        {            for(int j=1;j<=i;j++) printf("%I64d ",B[i][j]);            putchar('\n');        }*/    }    return 0;}
0 0