首页 > 其他分享 >数字三角形

数字三角形

时间:2024-11-03 12:18:28浏览次数:3  
标签:数字 int max inf using 1005 include 三角形

数字三角形

题目

给定一个如下图所示的 n n n层数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

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

详见898. 数字三角形 - AcWing题库

题解

正序

以 f [ x ] [ y ] f[x][y] f[x][y]表示其为在第 x x x行,第 y y y个与之前数字之和最大的数,则:
f [ x ] [ y ] = a [ x ] [ y ] + m a x ( f [ x − 1 ] [ y − 1 ] , f [ x − 1 ] [ y ] ) f[x][y]=a[x][y]+max(f[x-1][y-1] ,f[x-1][y]) f[x][y]=a[x][y]+max(f[x−1][y−1],f[x−1][y])
决策过程中,我们仅需判断一下边界情况即可,即:

  • 最左侧: f [ x ] [ y ] = a [ x ] [ y ] + f [ x − 1 ] [ y ] f[x][y]=a[x][y]+f[x-1][y] f[x][y]=a[x][y]+f[x−1][y].
  • 最右侧: f [ x ] [ y ] = a [ x ] [ y ] + f [ x − 1 ] [ y − 1 ] f[x][y]=a[x][y]+f[x-1][y-1] f[x][y]=a[x][y]+f[x−1][y−1].

最终可以得到数组 f [ n ] [ y ] f[n][y] f[n][y],只需比较出其中的最大值即可:

#include<iostream>
using namespace std;
int n, f[1005][1005], a[1005][1005] ,inf = 1e9;

int main()
{
    cin >> n;
    for(int i = 1 ;i <= n ;i ++)
        for(int j = 1 ;j <= i ;j ++)
            cin >> a[i][j];
    
    f[1][1] = a[1][1];
    for(int i = 2 ;i <= n ;i ++)
        for(int j = 1 ;j <= i ;j ++)
        {
            if(j == i) f[i][j] = a[i][j] + f[i - 1][j - 1];
            else if(j == 1) f[i][j] = a[i][j] + f[i - 1][j];
            else f[i][j] = a[i][j] + max(f[i - 1][j - 1] , f[i - 1][j]);
        }
    
    int ans = -inf;
    for(int i = 1 ;i <= n ;i ++)
        ans = max(ans ,f[n][i]);

    cout << ans << endl;
    return 0;
}

也可将边界的数组设为无穷大负数,如果加入该数则必定为最小数来避免边界条件的分析:

#include<iostream>
#include<cmath>
using namespace std;
int n, f[1005][1005], a[1005][1005] ,inf = 1e9;

int main()
{
    cin >> n;
    for(int i = 1 ;i <= n ;i ++)
        for(int j = 1 ;j <= i ;j ++)
            cin >> a[i][j];
    
    for(int i = 0 ;i <= n + 1 ;i ++)
        for(int j = 0 ;j <= i + 1 ;j ++)
            f[i][j] = -inf;
    
    f[1][1] = a[1][1];
    for(int i = 2 ;i <= n ;i ++)
        for(int j = 1 ;j <= i ;j ++)
             f[i][j] = a[i][j] + max(f[i - 1][j - 1] , f[i - 1][j]);
    
    int ans = -inf;
    for(int i = 1 ;i <= n ;i ++)
        ans = max(ans ,f[n][i]);

    cout << ans << endl;
    return 0;
}

当然,这个也可以将其转化为一维数组求解 f [ y ] f[y] f[y]直接表示 f [ n ] [ y ] f[n][y] f[n][y],不过变成了一层一层的枚举罢了:

#include<iostream>
#include<cmath>
using namespace std;
int n, f[1005], a[1005], inf = 1e9;

int main()
{
    cin >> n;
    
    for(int i = 0 ;i <= n + 1 ;i ++)
        f[i] = -inf;
        
    cin >> f[1];
    for(int i = 2 ;i <= n; i ++)
    {
        for(int j = 1 ;j <= i ;j ++)
            cin >> a[j];
        
        for(int j = i ;j >= 1 ;j --)
            f[j] = a[j] + max(f[j - 1] ,f[j]);
    }
    
    int ans = -inf;
    for(int i = 1 ;i <= n ;i ++)
        ans = max(ans , f[i]);
    
    cout << ans << endl;
    return 0;
}

同背包问题中,逆序防止数据被污染f[j] = max(f[j - 1] , f[j]) + a[j].

逆序

将三角形倒置后(数据输入仍是正序输入的,不过可以逆序规划):

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

则方程变为了:
f [ i ] [ j ] = m a x ( f [ i + 1 ] [ j ] , f [ i + 1 ] [ j + 1 ] ) + a [ i ] [ j ] f[i][j]=max(f[i + 1][j],f[i+1][j+1])+a[i][j] f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]

#include<iostream>
#include<cmath>
using namespace std;
int n, f[1005], a[1005][1005];

int main()
{
    int n;
    cin>>n;
    for(int i = 1 ;i <= n ; i++)
        for(int j = 1 ;j <= i ; j++)
            cin >> a[i][j];

    for(int i = n ;i >= 1 ; i--)
        for(int j = 1 ;j <= n ; j++)
            f[j] = max(f[j] , f[j + 1]) + a[i][j];

    cout << f[1];
    return 0;
}

标签:数字,int,max,inf,using,1005,include,三角形
From: https://blog.csdn.net/2301_80010036/article/details/143463795

相关文章

  • 数字信号处理Python示例(3)生成三相正弦信号
    文章目录前言一、三相正弦信号的表示二、生成三相正弦信号的Python代码三、三相正弦信号的图示与分析四、生成幅度不相等的三相正弦信号的Python代码五、幅度不相等的三相正弦信号的图示与分析写在后面的话前言首先给出三相正弦信号的数学表达式,并给出生成三相正弦......
  • three.js+vue智慧社区web3d数字孪生三维地图
    案例效果截图如下:具体案例场景和功能,详见b站视频:https://www.bilibili.com/video/BV1Bb421E7WL/?vd_source=7d4ec9c9275b9c7d16afe9b4625f636c 案例场景逻辑代码:<template><divid="whole"><!--threejs容器--><divid="three"ref="co......
  • 写在第六个“深圳企业家日”,看KPaaS如何助力企业数字化转型
    每年的11月1日是“深圳企业家日”,这是深圳为表彰本地企业家精神而设立的纪念日。这一天,深圳的创业者和企业家们聚集一堂,总结过往,展望未来。企业家们在深圳的经济发展、技术创新和社会进步中扮演了重要角色,而这一天的设立则为他们提供了展示成就和分享经验的平台。随着市场的快......
  • 为什么大家都在学数字孪生呢?
    随着物联网,大数据、人工智能等技术的发展,新一代信息技术与制造业正在深度融合,人们与物理世界的交互方式正在发生转折性的变化。数字化转型正在成为企业的重要战略,而数字孪生则成为全新的焦点。当下,在数字技术和数字经济火热发展的过程中,数字孪生无疑成为数字技术领域的重要支......
  • 数字IC中Verilog编码注意事项
    一、禁用多驱动一个wire型变量(具体到每个bit),只能在一个assign语句赋值一个reg型变量(具体到每个bit),只能在一个always语句赋值综合工具不能识别互斥条件在一个always块内,一次触发,对同一个信号最多只赋一次值比如:不要用多个ifalways@(posedgeclkornegedgerstn)begin......
  • 打造一个带报时功能的卡通数字时钟 —— 使用Python和Tkinter
    引言在这个数字化时代,我们周围充满了各种各样的电子设备。然而,有时候一个简单而有趣的数字时钟也能给我们的生活带来不少乐趣。本文将介绍如何使用Python和Tkinter库来创建一个带有背景图片和报时功能的卡通数字时钟。这个项目不仅能够展示当前时间,还能在整点和半点时播放......
  • 番外番外——猜数字游戏
    文章目录猜数字习一、随机数的生成1.1rand函数1.2srand函数1.3time1.4设置随机数的范围二、猜数字游戏实现三、结尾猜数字习写一个猜数字游戏游戏要求:电脑自动生成1~100的随机数玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏......
  • 打印直角三角形
    今天给大家分享一个打印直角三角形的方法其实直角三角形在终端中的显示是又空格和星号组成的只要将其看成一个矩形,并找出两者规律便可实现(与打印菱形有一定相似的理解),下面我们来分享一个更简便的方法 它的规律是行和列之和小于n-1(n为我们输入的数)便打印空格,其余位置就打印......
  • 数字信号处理:自动增益控制(AGC)
    自动增益控制::自动增益控制(AutomaticGainControl,AGC)是一种信号处理技术,用于在接收端调整输入信号的增益(或放大系数),以保持信号在一个合适的强度范围内,从而防止信号过弱或过强。工作原理:AGC电路通过测量接收到的信号强度,将该强度与一个预设的理想水平进行比较,并根据两者的......
  • FPGA数字信号处理—1S上报一次解析数据
    数字信号结果处理完毕之后,需要定时上报,利用计数器完成定时上报;moduleError_bit_report(inputwireclk,//时钟信号inputwirerst_n,//复位信号,低有效inputwireerror_compare_ena,//误码比较使......