美文网首页
杭电-2084 数塔

杭电-2084 数塔

作者: 这样你就找不到我了 | 来源:发表于2019-12-24 14:39 被阅读0次
image.png

我的思路:
首先,我们根据结点在二维数组中的位置对结点进行简单的编号,例如:


image.png

从顶点出发,我们面对的第一个问题就是该往左走还是往右走。
我们假设起点为 a[ i ][ j ],从左走 经过的结点的数字之和最大为d[ i+1 ][ j ],往右走经过的结点的数字之和最大为d[ i+1 ][ j+1 ]

显然,
1,对于不是在底部倒数二行的结点,在没有遍历完全部数字结点的情况下,我们无法求出最大和d[ i ][ j ],但是可以将其递归表示为
d[ i ][ j ] = a[ i ][ j ] (本身) + max(d[ i+1 ][ j ], d[ i+1 ][ j+1 ])
max 作用是取较大值

2,底部倒数二行结点可以直接求出d[ i ][ j ],往左则 d[ i ][ j ] = a[ i ][ j ] + a[ i+1 ][ j ],往右则 d[ i ][ j ] = a[ i ][ j ] + a[ i+1 ][ j+1] 同样取它们的较大值。

3,底部则直接d[ i ][ j ] = a[ i ][ j ]
不难发现情况2包括在情况1中,之所以写出来主要是想让大家知道,这是可以求出来的。

但仅是这样还不够,复杂度过高,因为 “夹在中间的结点” 被重复计算了。

image.png

实际计算了这么多的内容


image.png

可以想象,当数塔很高的时候,重复计算的量非常大。
如果数塔高度为n,则一共重复计算了2^n-1个结点。

为避免重复计算,我们可以使用一个d[ i ][ j ]数组,初值赋上一个结点不可能存储的数字,在该题中结点取值范围为[0,99],所以我们可以赋值-1

每次计算前都判断d[ i ][ j ]是否已经存在,如果已经存在则直接跳过就行了。

AC代码:

#include<stdio.h>

int a[101][101];
int d[101][101];
int n,high;

int max(int a,int b){
    if(a >= b)
        return a;
    return b;
}

int solve(int i, int j){
    if(d[i][j]==-1){
        if(i<high)
            return d[i][j] = a[i][j] + max(solve(i+1,j), solve(i+1,j+1));
        else
            return d[i][j] = a[i][j];
    }
    else
        return d[i][j];
    
}

int main(){
    scanf("%d",&n);
    for(int k=0;k<n;k++){
        scanf("%d",&high);
        for(int i=0;i<high;i++)
            for(int j=0;j<=i;j++){
                scanf("%d",&a[i][j]);
                d[i][j] = -1;    
            }
        
        printf("%d\n",solve(0,0));
    }
    return 0;
}

参考 : 《算法竞赛入门经典第二版-刘汝佳》第九章动态规划初步

相关文章

  • 杭电-2084 数塔

    我的思路:首先,我们根据结点在二维数组中的位置对结点进行简单的编号,例如: 从顶点出发,我们面对的第一个问题就是该...

  • HDU 2084 数塔DP

    解题思路:从最顶层或者最底层出发,推到最底层或者最顶层,然后找出其中那条路线的值最大 我才用的是从下往上,代码如下

  • 动态规划 - 杭电acm2084

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

  • 数塔(DP)hdu2084

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步...

  • CUC-SUMMER-5-A

    A - 数塔 HDU - 2084 已经告诉你了,这是个DP的题目,你能AC吗? Input输入数据首先包括一个整...

  • 斯特林定理的应用

    最近做了杭电上的一个题hdu1018,就是求一个数的阶乘有多少位数。比如10!= 3628800,有7位数。所以,...

  • 杭电助手

    杭电助手(服务号hduhelp,订阅号hduhelper)是隶属于杭州电子科技大学党委学工部的校级组织,我们有前端...

  • 杭电2015

    这道题看起来不复杂,但做起来还是挺费工夫的。里面要用很多的循环结构,很容易在些小地方出错。我就是因为那些小问题而搞...

  • 杭电打卡

    这题主要是数学方法求解,其他没什么难度,关键是得出递推公式。 假如第一个和最后一个格子能相同颜色,我们可以很快算出...

  • 杭电oj 第11页 java版答案

    杭电oj 第2000- 2099 题 全答案杭电oj 第十一页答案 具体路径在 src/main/java/com...

网友评论

      本文标题:杭电-2084 数塔

      本文链接:https://www.haomeiwen.com/subject/nhtfoctx.html