• (记忆化搜索)数塔 (zznu 1271)


    http://acm.zznu.edu.cn/problem.php?id=1271

    1271: 数塔

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 109  解决: 78
    [提交][状态][Edit] [TestData]

    题目描述

     

     

     

     

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 
    有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 


     

    输入

    输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。

    输出

     

     

     

    对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。

    样例输入

    1
    5
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5 
    

    样例输出

    30

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    #define met(a,b) (memset(a,b,sizeof(a)))
    #define N 110
    #define INF 0xffffff
    
    int a[N][N], dp[N][N];
    
    int DFS(int n, int x, int y)
    {
        if(!dp[x][y])
        {
            if(x>n || y>n) return 0;
            return dp[x][y]=a[x][y] + max(DFS(n, x+1, y), DFS(n, x+1, y+1));
        }
        return dp[x][y];
    }
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int n, i, j;
    
            scanf("%d", &n);
            met(a, 0);
            met(dp, 0);
            for(i=1; i<=n; i++)
            for(j=1; j<=i; j++)
               scanf("%d", &a[i][j]);
    
           printf("%d
    ", DFS(n, 1, 1));
    
           /**
           for(i=1; i<=n; i++)
           for(j=1; j<=i; j++)
            printf("%d%c", dp[i][j], j==i?'
    ':' ');
            **/
        }
        return 0;
    }
     
  • 相关阅读:
    Codeforces 741D 【Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths】
    Codeforces 235C 【Cyclical Quest】
    UOJ #62.【UR #5】怎样跑得更快
    luoguP3648 [APIO2014]序列分割
    luoguP4782 [模板]2-SAT问题
    原博客已废弃
    个数可变的参数收藏
    新的一年开始。
    文件上传下载总结
    模板模式学习(转)
  • 原文地址:https://www.cnblogs.com/YY56/p/5448207.html
Copyright © 2020-2023  润新知