数塔问题(经典动态规划)

刷题之路:1410 - 【基础】数塔的行走路径(递推求解)c++题解 每天学一道,智商肯定高!!! 阅读详情

两种方法,一种从上到下的递归寻找max;另一种为从下到上的迭代max

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?

Input

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

Output

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

Sample Input

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

Sample Output

30

一种从上到下的递归寻找max

#include <iostream>
#include <algorithm>
#include<string.h>
using namespace std;


const int N = 1000;//为了算法写起来简单,这里定义一个足够大的数用来存储数据(为了避免运算过程中动态申请空间,这样的话算法看起来比较麻烦,这里只是为了算法看起来简单)
int data[N][N];//存储数塔原始数据
int dp[N][N];//存储动态规划过程中的数据
int n;//塔的层数

/*动态规划实现数塔求解*/
void tower_walk()
{
    // dp初始化
    for (int i = 1; i <=n; ++i)
    {
        dp[ n ][i] = data[ n ][i];
    }
    for (int i = n-1 ; i >= 0; --i)
    {
        for (int j = 1; j <= i; ++j)
        {
            // 使用递推公式计算dp的值
            dp[i][j] =  max(dp[i + 1][j], dp[i + 1][j + 1]) + data[i][j];
        }
    }
}
int main()
{
    int num;
    cin>>num;
    while(num--)
    {
        memset(dp,0,sizeof(dp));
        memset(data,0,sizeof(data));

        cin >> n;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= i; ++j)
            {
                cin >> data[i][j];
            }
        }
        tower_walk();
        cout<<dp[1][1]<<endl;
    }
}

 

另一种为从下到上的迭代max

#include <iostream>
#include <algorithm>
#include<string.h>
using namespace std;


const int N = 1000;//为了算法写起来简单,这里定义一个足够大的数用来存储数据(为了避免运算过程中动态申请空间,这样的话算法看起来比较麻烦,这里只是为了算法看起来简单)
int data[N][N];//存储数塔原始数据
int dp[N][N];//存储动态规划过程中的数据
int n;//塔的层数
int vis[N][N];

/*动态规划实现数塔求解*/
int tower_walk(int x,int y)
{
    if(x==n)
        return data[x][y];
    if(vis[x][y])
        return vis[x][y];

    vis[x+1][y]=tower_walk(x+1,y);
    vis[x+1][y+1]=tower_walk(x+1,y+1);

    if( vis[x+1][y] >= vis[x+1][y+1] )
        return vis[x+1][y] + data[x][y];
    else
        return vis[x+1][y+1] + data[x][y];

    /*
    for (int i = n-1 ; i >= 0; --i)
    {
        for (int j = 1; j <= i; ++j)
        {
            // 使用递推公式计算dp的值
            dp[i][j] =  max(dp[i + 1][j], dp[i + 1][j + 1]) + data[i][j];
        }
    }
    */
}
int main()
{
    int num;
    cin>>num;
    while(num--)
    {
        memset(dp,0,sizeof(dp));
        memset(data,0,sizeof(data));
        memset(vis,0,sizeof(vis));

        cin >> n;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= i; ++j)
            {
                cin >> data[i][j];
            }
        }
        for (int i = 1; i <=n; ++i)// dp初始化
        {
            dp[ n ][i] = data[ n ][i];
        }

        cout<<tower_walk(1,1)<<endl;
    }
}

 

 

刷题之路:1216 - 【基础】数塔问题(递推求解)题解 每一天学一道,智商肯定高!!! 阅读详情

相关推荐

数塔问题--经典的动态规划问题

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? ![这里写图片描述](http://img.blog.youkuaiyun.com/20170227224434064?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3Jpb25fcGlzdGFjaG

⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄. 菜鸟不吃草! 643

HDU 2084 数塔 (dp)

HDU 2084 数塔 (dp) 题目描述: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 题目限制:数塔高度&lt;=100 分析 :典型dp,N&lt;=100,直接开二维数组储存每个节点的数据即可。因为最后一层每个节点的值确定,从倒数第二层开始遍历,求经过倒数第二层每个节点的最大值,并依次向上遍历,最终遍历根节点,...

ronnie14165的博客 560

动态规划快速入门 之 经典的数塔问题

数塔问题练习网址 戳这<<<题目要求题意给定一个具有 N 层的数字三角形,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最大路径得分。 输入1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5输出30状态设计 显然满足重叠子问题和最优子结构性质。 递推公式:DP(X,Y) = max(DP(X+1,Y),DP(X+1,Y+

Daioo 随笔 6434

数塔问题

数塔问题 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数...

weixin_43398327的博客 584

C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题

数字金字塔 题目描述 考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中, 从7到3到8到7到5的路径产生了最大和:30 输入 第1行:1个整数R(1 接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。

The most secret blogs 7676

数塔问题 DP

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

HDOJ_杭电2084_数塔问题,经典阶段DP动态规划问题

简单的动态规划题目。 关键在于状态转移方程。 代码: /***** HDOJ_2084_数塔问题 ********/ /******** written by C_Shit_Hu ************/ ////////////////动态规划DP问题/////////////// /***********************************

[&] () {} 2377

基于Qt与PaddleOCR的跨平台OCR工具开发实战

本文详细介绍了基于Qt与PaddleOCR开发跨平台OCR工具的实战经验。通过Qt的跨平台特性和PaddleOCR的高效识别能力,开发者可以快速构建支持Windows、Linux和macOS的OCR工具。文章涵盖了环境配置、核心功能实现、性能优化及打包发布等关键环节,特别针对中文识别、内存管理和多线程处理等常见问题提供了解决方案。

weixin_30296405的博客 88

经典数塔问题(动态规划)

有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。 从顶点出发时到底是向左走还是向右走应取决于向左走能取得最大值还是向右走能取得最大值,只有两条路径上的最大值求出来了才能做出决策, 即dp[1][1] = max(dp[2][1],dp[2][2]) 故由此推得状态转移方程为dp[i] = max...

2007

逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现

逆概率加权(IPW)是一种用于解释由于非随机选择观测值或人群信息的非随机缺失而造成的缺失和选择偏差的方法。原理:这种方法可以通过对观察值的加权来修正分析,使其具有被选中的概率。IPW是基于这样一个假设,即整个研究人群都有可以预测纳入概率(非遗漏)的个体信息,因此,在考虑到这些信息后,我们可以仅从非遗漏的观察值开始对整个目标人群进行推断。计算的程序如下:首先,我们考虑整个研究人群,用逻辑回归模型计算非失访信息的概率,其中响应是非失访,协变量是其可能的预测因素。每个受试者的权重是由预测概率的倒数给出的。然后使用

Christina 5万+

RK3568下YT8531/YT8521 PHY移植避坑指南:RGMII与设备树详解

嵌入式Linux网络调试中,PHY芯片作为MAC与物理介质之间的桥梁,其驱动配置直接影响网络稳定性。RGMII接口的延时补偿、PHY地址设定以及复位时序是设备树配置中的关键环节,稍有差错便会出现链路已通却无法通信的现象。通过理解PHYLIB框架与mdio总线枚举原理,开发者可以快速定位寄存器级故障。在RK3568等工业级平台中,裕太微YT8531/YT8521凭借高性价比与内核主线支持,成为替代传统方案的热门选择。从设备树模板、内核配置到常见坑点,系统梳理千兆以太网PHY的移植与调试方法,帮助开发者少走弯路

weixin_29189381的博客 212

动态规划 经典例题|数塔、货郎担问题、找零钱

编写一个函数来计算可以凑成总金额所需的最少的硬币个数。观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。i>n时,f[i][j]=0;i=n 时 f[i][j]=a[i][j];售货员从城市i到城市j的旅行费用是一个整数,旅行所需的全部费用是他旅行经过的的各边费用之和,而售货员希望使整个旅行费用最低。在上面的样例中,从7→3→8→7→5 的路径最大。

m0_63471305的博客 448

对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理:

故障诊断,对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理

qq_44757503的博客 6058

The Triangle--动态规划经典问题--数塔问题

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=18

TryIT1993的专栏 1188

X猫免费小说安卓逆向分析

七猫免费小说安卓逆向分析 难度(♥♥) 文章目录七猫免费小说安卓逆向分析 难度(♥♥)1. 查壳2. 抓包分析3. sign1. Frida-rpc2. Native函数分析快3点了. 睡觉~ 白天再继续写! 1. 查壳 我这边使用的是ApkTool, 拖进去显示未加壳。 2. 抓包分析 POST https://xiaoshuo.wtzw.com/api/v1/login/index HTTP/1.1 net-env: 1 channel: qm-cbcpa056_wm is-white: 0 platf

Qiled的博客 4365

2020计算机专业保研夏令营面经:中科院计算所网数机试题目

计算所网络数据科学与技术重点实验室的第一阶段是机试。机试不限程序语言,要求提交源代码。

乔卿的博客 2957

动态规划十大经典问题

动态规划十大经典问题 数塔取数问题、矩阵取数问题、最大连续子段和、最长递增子序列、最长公共子序列、最长公共子串、最短编辑距离、背包问题、正整数分组、股票买卖问题。

后端为主,前端为辅。 4983

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1349

数塔 HDU - 2084【动态规划】题解

题解目录1.题目2.代码 1.题目 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的...

林深不见鹿 的博客 381

广义S变换在MATLAB中的仿真

广义S变换是对信号进行时频分析的一种方法,它基于短时傅里叶变换(Short-Time Fourier Transform,STFT)和小波变换(Wavelet Transform)。广义S变换将信号分解成时频平面上的一系列矩形框,每个框内的数值表示相应时刻和频率下信号的能量。本文将介绍如何使用MATLAB进行广义S变换的仿真,并提供相应的源代码。函数,我们可以方便地计算信号的广义S变换,并获取时频平面上的时域和频域信息。广义S变换在信号处理和相关领域中具有广泛的应用,可以用于分析和处理各种类型的信号。

CodeNexus的博客 1119

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数塔

数塔 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔...

HGlport的博客 339

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

动态规划--数塔

数塔是动态规划的一道经典题 认识数塔前,先认识一下动态规划,动态规划不是一种特定的算法,而是一种具有较强的技巧性的手段,或者说是思想,但所有动态规划的题离不开两个核心: 1.状态 2.状态转移方程 当我们抓住这两个核心,我们的问题就能解决一大半! ————————————————————————————————————— 题目: 图片上便是一个数塔,现在要解决的问题是,从数塔顶层到

Jos's blogs 1162

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: A - 一只小蜜蜂...B - 骨牌铺方格(兔子数列,动态规划)
下一篇: 快速幂取模(求a^b mod c = 几)
while_black
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值