数字三角形问题

news2024/11/20 1:40:18

数字三角形问题

  • 一、题目描述
  • 二、题目分析
    • 1、问题分析
    • 2、思路分析
      • (1)状态转移方程
        • 状态表示
        • 状态转移
      • (2)循环的设计
  • 三、代码实现

一、题目描述

在这里插入图片描述

二、题目分析

1、问题分析

这道题给我们的第一眼感觉就是情况太多了,太复杂了。而这种情况下,我们往往需要缩小问题的规模,从小问题看起,看清这道题的规律。

在这里插入图片描述
我们看上面图片中最左边的图,我们发现这个规模的问题就非常好解决了,我们只需要对比从1到2和从1到3谁大即可。

然后我们看中间的图片,我们的从最上方的5到下一层的方式有两种,要么到1,要么到4。在这个过程中,我们发现当它到1的时候,我们遇到了和左边相同的问题,也就是说左面的是中间的子问题。这个规律在第三个图中依然满足。
在这里插入图片描述

那么当一个问题满足这个特点的时候,我们就说这个问题具备重叠子问题的性质。

同时在我们每次选择过后,问题的规模都会减小,但是我们依旧需要做出最优选择,此时说明这个问题具备最优子结构

另外,我们解决大规模问题的时候,我们的小问题的最优解是没有发生变化的。而这种性质称作无后效性

当一道题的问题满足上述三个性质的时候,我们通常可以使用动态规划的方式去解决。

2、思路分析

既然要用动态规划的方式来解决这道题的话,我们就需要考虑两个问题:状态转移方程的书写、循环的设计

(1)状态转移方程

状态转移方程的作用就是利用子问题去解决问题,或者说是,将一个大规模问题转化为小规模问题。
而转移方程的书写我们还需要思考两个问题:
1、状态表示
2、状态转移

状态表示

我们发现,我们一个问题的规模其实就取决于最高点的那个坐标,所以我们将最高点的坐标作为状态的表示。

f ( i , j ) f(i,j) f(i,j)指的是,我们坐标为 ( i , j ) (i,j) (i,j)的点向下走到底的时候,所能够经过路线的点的和的最大值

状态转移

我们根据我们刚刚举的例子,我们发现减小问题规模的关键就是在向左下和向右下走做出一个决定,然后在二者之间取出一个最大值。但是我们需要注意的是,我们向下走其实坐标值是在增大的。
在这里插入图片描述

如下:

f ( i , j ) = m a x { f ( i + 1 , j + 1 ) + w [ i ] [ j ] f ( i + 1 , j ) + w [ i ] [ j ] f(i,j)=max \begin{cases} f(i+1,j+1)+w[i][j]\\ f(i+1,j)+w[i][j] \end{cases} f(i,j)=max{f(i+1,j+1)+w[i][j]f(i+1,j)+w[i][j]

(2)循环的设计

我们相同规模的问题在同一行,所以我们最外层循坏一定是行数,那么第二层循环就是列数

我们一定是先从小规模的问题开始枚举,而最小规模的问题对应的是最大的下标。因此,我们只需要将第一层逆置过来即可,第二层是否逆置无所谓。

三、代码实现

#include<iostream>
using namespace std;
const int N=1e3+10;
int dp[N][N],a[N][N];
int n,m;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        scanf("%d",&a[i][j]);
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
        }
    }
    cout<<dp[1][1]<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟化环境下,如何高效开展勒索病毒防护加固?

本文重点 近些年&#xff0c;勒索病毒攻击事件频发&#xff0c;由于其“难发现、难阻止、难破解”的特点&#xff0c;不少用户——尤其是使用虚拟化的金融、医疗、制造、公共服务等重要行业用户——已遭受严重数据与经济损失。勒索攻击的防控是一项系统性工程&#xff0c;除了…

2-2-3-9-1-1、jdk1.7HashMap详解

目录数据结构链表的作用链表问题数据结构简图源码解析重要成员变量说明构造函数put操作初始化数组Key为null的处理计算hash添加链表节点--新增Entry扩容缺点扩容死锁分析单线程扩容多线程扩容数据结构 jdk1.7的hashmap的底层结构是数组加单向链表实现的。将key的hash值进行取模…

深度学习环境搭建

深度学习环境搭建0.引言1.Jupyter Notebook1.1.ANACONDA安装1.2.基于conda安装Jupyter Notebook1.3.Jupyter Notebook使用2.Pycharm2.1.安装Pycharm2.2.Pycharm设置0.引言 一步步采坑更新。 1.Jupyter Notebook 官方文档 安装参考 通过安装Anaconda来解决Jupyter Notebook…

300行HTML+CSS+JS代码实现动态圣诞树

文章目录1. 前言2. 效果展示3. 准备&#x1f351; 下载编译器&#x1f351; 下载插件4. 源码&#x1f351; HTML&#x1f351; JS&#x1f351; CSS5. 结语1. 前言 一年一度的圣诞节和考研即将来临&#xff0c;那么这篇文章将用到前端三大剑客 HTML CSS JS 来实现动态圣诞树…

Java面试题(六)多线程经典编程题

经典的多线程编程题猜数字游戏键盘输入练习3个线程轮流打印ABC多窗口买票猜数字游戏 题目说明&#xff1a;有2个线程&#xff0c;第一个线程A随机一个100内的数&#xff0c;第2个线程B来猜&#xff0c;B每次猜一个数后A会判断&#xff0c;如果猜对了程序结束&#xff0c;如果猜…

工具在接口测试中发挥什么样的作用?

接口测试究竟是什么&#xff1f;为什么要用接口测试&#xff1f;它有哪些工具呢&#xff1f;这一连串的问题敲击着我们&#xff0c;请带着这些问题&#xff0c;在本文中寻找答案&#xff0c;我将为您打开接口测试的大门。 1 初探接口测试 接口测试是什么。它检查数据的交换&…

从《我要投资》,看藏在“对立面”里的创业正解

文|智能相对论 作者|青月 六位07届的快乐男声选手在象山体验养鹅&#xff0c;意外出圈&#xff1b;随后播出的09届超女的怀旧综艺却热度一般&#xff0c;可见只有单纯的情怀消费并不能保证节目的口碑&#xff0c;只有建立在准确的节目定位与恰当的价值输出基础上&#xff0c;…

面试必备:从常见的存储引擎到混淆的锁分类,请上车

今天我们来总结一下MyISAM和InnoDB引擎下锁的种类及使用方法。 MySQL的四大常见存储引擎 谈到MyISAM和InnoDB了我们先来了解一下什么是存储引擎吧。MySQL中的数据用各种不同的技术存储在文件&#xff08;或者内存&#xff09;中&#xff0c;这些技术中的每一种技术都使用不同…

m基于贝叶斯理论的超分辨率重构算法matlab仿真,对比Tikhonov重构算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 超分辨率(Super-Resolution)通过硬件或软件的方法提高原有图像的分辨率&#xff0c;通过一系列低分辨率的图像来得到一幅高分辨率的图像过程就是超分辨率重建。超分辨率成像&#xff08;SR-imagi…

一个内核oops问题的分析及解决

最近在调试设备时&#xff0c;遇到了一个偶发的开机死机问题。通过查看输出日志&#xff0c;发现内核报告了oops错误&#xff0c;如下所示&#xff08;中间省略了部分日志&#xff0c;以......代替&#xff09;&#xff1a; Unable to handle kernel NULL pointer dereference…

YOLOV7学习记录之训练过程

在前面学习YOLOV7的过程中&#xff0c;我们已经学习了其网络结构&#xff0c;然而实际上YOLOV7项目的难点并不在于其网络模型而是在于其损失函数的设计&#xff0c;即如何才能训练出来合适的bbox。 神经网络模型都有训练和测试&#xff08;推理&#xff09;过程&#xff0c;在Y…

QT JS交互、调用JS、传值

本文详细的介绍了QT JS交互、调用JS、传值的各种操作&#xff0c;包括QT向JS传递String字符串、包括QT向JS传递Int数字、包括QT向JS传递List数组&#xff0c;同时也接收JS向QT返回的List数组、JS向QT返回的Json、JS向QT返回的数字、JS向QT返回的字符串。 本文作者原创&#xff…

Vue基础8之Vue组件化编程、非单文件组件与单文件组件

Vue基础8Vue组件化编程对组件的理解一些概念的理解非单文件组件基本使用几个注意点组件的嵌套VueComponent一个重要的内置关系先导篇&#xff1a;原型对象正文&#xff08;可以理解为类的继承&#xff09;单文件组件Vue组件化编程 对组件的理解 传统方式&#xff1a; 使用组…

计算机网络-交换方式

目录电路交换&#xff08;Circuit Switching&#xff09;分组交换&#xff08;Packet Switching&#xff09;报文交换&#xff08;Message Switching&#xff09;电路交换、报文交换、分组交换的对比电路交换&#xff08;Circuit Switching&#xff09; 在电话问世后不久&#…

扫雷游戏的设计(百分百还原电脑操作)

目录 &#x1f332;了解扫雷游戏的作用原理并梳理思路 &#x1f332;扫雷游戏前期部分完善 &#x1f337;文件的创建 &#x1f337;创建菜单&#xff0c;完善主函数 &#x1f333;代码呈现&#xff1a; &#x1f332;扫雷游戏主题内容 &#x1f334;第一步初始化棋盘 &#x1…

Gradle中如何修改Springboot引入的依赖版本

扫描漏洞升级 不知道各位是否遇到过以下问题&#xff1a; 当下层项目将spring引入的某个依赖版本升级之后&#xff0c;上层项目只要指定了Springboot版本&#xff0c;那么还是会将这个版本改回去&#xff1f; 比如&#xff1a;现在有两个Springboot项目A、B&#xff0c;B项目…

Git安装和配置

GitGitee 官网安装配置教程&#xff1a;https://gitee.com/help/articles/4104本文是以官网教程为基础而展开的实践笔记。初学者可以以本文为引入&#xff0c;但建议最终以官方文档为最终深入学习的参考。一、 下载和安装Git 1、官网下载&#xff1a;https://git-scm.com 如果对…

HTML5基础

HTML5 文章目录HTML5概述开发工具浏览器开发软件DemoHTML5语法HTML5标签HTML5标签属性HTML5文档注释HTML5文档结构头部内容主体内容DemoHTML5常见标签常见块级标签标题标签水平线标签段落标签换行标签引用标签预格式标签无序列表标签有序列表标签定义列表标签分区标签常见行级标…

【Java寒假打卡】Java基础-继承

【Java寒假打卡】Java基础-继承一、继承的好处和弊端二、继承的成员变量访问特点三、重写方法四、方法重写的注意事项五、权限修饰符六、构造方法一、继承的好处和弊端 继承的好处 提高了代码的复用性 提高了代码的维护性 让类和类之间产生了关系 是多态的前提 继承的弊端 …

Flink-使用filter和SideOutPut进行分流操作

文章目录1.什么是分流&#xff1f;2. 过滤器(filter)3. 使用侧输出流&#xff08;SideOutput&#xff09;&#x1f48e;&#x1f48e;&#x1f48e;&#x1f48e;&#x1f48e; 更多资源链接&#xff0c;欢迎访问作者gitee仓库&#xff1a;https://gitee.com/fanggaolei/learni…