洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles题解

2023-10-27

接触的第一道DP题,动态规划入门

题目描述

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

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

在上面的样例中,从 7→3→8→7→5 的路径产生了最大

输入格式

第一个行一个正整数r ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 
输出格式

单独的一行,包含那个可能得到的最大的和。

30

什么是动归?

某度上是那么说的

动态规划是运筹学的一个分支,是求解决策过程最优化的过程。

总的来说,动态规划最大的特征也是前提条件也就是最优化原理和无后效性。

最优化原理就是指

在当前看来,这一选择策略是最佳选择。

无后效性就是指

以前各阶段的状态无法影响它未来的决策。

是不是还不太清楚?我们直接来看这道题吧。

题目分析

我们需要求出,数字三角形中,从第一层到最底层的中的一条路径,使得这条路径上的数字之和最大。

a[ i ][ j ] 来存储处于第 i 排第 j 个数字的值。

定义一个二维数组 dp ,使得 dp[ i ][ j ] 表示从第 i 层第 j 个数走到最下面一层所得到的最大的路径数之和。

拿样例来说:

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

因为共五层,所以 dp[ 5 ][ j ] 的值就为 a[ 5 ][ j ]

dp[ 4 ][ 1 ] 即第四排第一个数2,表示的是2到第五排的最大的路径数之和,

dp[4][1] = a[4][1] + max(dp[5][1],dp[5][2]) = 2+5 = 7

dp[ 4 ][ 2 ] 即第四排第二个数7,表示的是7到第五排的最大的路径数之和,

dp[4][2] = a[4][2] + max(dp[5][2],dp[5][3]) = 7+5 = 12

dp[ 3 ][ 1 ] 即第三排第一个数8,表示的是8到第五排的最大的路径数之和,

dp[3][1] = a[3][1] + max(dp[4][1],dp[4][2]) = 8+12 =20

可以看出, dp[ i ][ j ] 的值取决于当前位置上数字的值,和下一层相邻两个数的 dp 值。

可以看到这里每一次更新dp的值时,都是遵循最优化原理的,且当前的过去的状态不会再因为现在的决策而改变。

所以当 i = { 1 , 2 , 3 , 4 }

dp[ i ][ j ] = a[ i ][ j ] + max( dp[ i+1 ][ j ],dp[ i+1 ][ j+1 ] )

我们把这样的式子称作动态规划的状态转移方程,在想要用到动态规划解决问题时,推出正确的状态转移方程非常重要。

动态规划能极大的提高效率。

上题也可以用 递归dfs(深度优先搜索) 解决,但是这两种算法时间复杂度都较高,在数据范围大时,可能会超过时间限制。

但如果使用动归,时间复杂度只有O(n)=n^2。虽然不算最好,但也足够解决这一类竞赛题目了。

代码实现看这里

#include<iostream>
using namespace std;
int a[1005][1005],n;//注意数据范围
int dp[1005][1005];
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=n;i>=1;i--)//第n层dp值直接设为a的值
        for(int j=1;j<=i;j++)//从第n-1层开始更新dp的值
            dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);//状态转移方程
    cout<<dp[1][1]<<endl;
	return 0;		
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles题解 的相关文章

  • qt std::cout 中文乱码

    char out 输入操作 r n std cout lt lt out QString qOut 输入操作 r n std cout lt lt qOut toStdString std cout lt lt qOut toStdWStr
  • python3---情感分析(基于词典中文)

    写在前面 现有的情感分析比较常用的有两种 分别是基于词典的和机器学习 前者也属于非监督学习 后者自然一般属于监督学习 刚开始学情感分析 下面先从 基于词典的情感分析 开始进行 词典 我东搜西找找到了一些感觉是常用的字典 主要有 台湾大学NT
  • 2.NanoPi M1(全志H3)的GPIO控制总结(内核驱动)

    开发环境 VM Ubuntu 编译环境 linux3 4 交叉编译工具 arm linux gcc 4 4 3 GPIO内核驱动程序链接 https download csdn net download ddffyhg 11022291 用
  • ABAP DOI 下载SMW0的EXCEL和WORD模板

    用 FUNCTION SAP OI LOAD MIME DATA 下载SMW0的模板 用METHOD LR PROXY gt OPEN DOCUMENT FROM TABLE 打开模板 没找到和ole一样先下载 在打开的方法 SMWO上载模

随机推荐

  • 用正则表达式爬豆瓣电影数据

    学了正则表达式后 简单的用它来爬取豆瓣网的数据 import re from urllib request import urlopen def getPage url 获取网页的字符串 response urlopen url retur
  • STL_set——set::find

    Reference Returns an iterator addressing the location of an element in a set that has a key equivalent to a specified ke
  • 酷比魔方AI慧读器评测 – 实用,值,但不够智能

    转自 https post m smzdm com p ar07qo8x 前段时间在网上看到了酷比魔方AI慧读器的宣传 说是可以让孩子爱上阅读 还可以教会孩子正宗的伦敦腔英语 真的让人很好奇这是一款什么样的神奇产品 正好4月份是小侄子三岁的
  • 使用具有OpenCV和Tesseract的Raspberry Pi光学字符识别(OCR)

    了解如何使用Tesseract和OpenCV通过Raspberry Pi相机从PDF等图像中提取文本 在本教程中 我将向您展示如何使用光学字符识别通过Raspberry Pi相机和Raspberry Pi从图像中提取文本 Pi相机将捕获图像
  • CentOS6.8环境下,通过docker创建Anaconda3容器的基础使用

    目录 一 主要步骤 1 查找docker里评分最高的Anaconda 2 拉取下来 3 运行Anaconda虚拟容器 并挂载 4 进入容器后 创建虚拟环境 5 进入虚拟环境 6 进入虚拟环境后 就可以下载自己所需要的第三方库了 7 执行相关
  • 图形图像学习随笔:计算机图形学的一些基本概念

    本文内容摘抄于 计算机图形学的概念 一 计算机图形学的范畴 1 图形主要分为两类 一类是基于线条信息表示的 如工程图 等高线地形图 曲面的线框图等 另一类是明暗图 也就是通常所说的真实感图形 2 计算机图形学利用计算机建立图形所描述的场景和
  • Django小结02

    1 数据库设置 1 打开myproject settings py 配置mysql数据库 需要添加密码 默认端口3306 在myproject init py中 import pymysql pymysql install as MySQL
  • 自动化Playwright专题汇总

    文章目录 序言 一 特性 1 测试和自动化框架 2 支持所有主流浏览器 3 快速可靠的执行 4 强大的自动化功能 5 自动化工具对比 在这里插入图片描述 https img blog csdnimg cn 97189e12b617477a8
  • 多线程爬取百度关键字结果,并获取真实url

    项目目的 练习 项目要求 根据给定的关键字 检索百度的结果 将结果保存到文件中 遇到问题 1 python list取值问题 有些看不清晰的 用for index item in enumerate array 查看 2 选取想要的元素 两
  • Linux系统磁盘扩容

    本机为CentOS7 9 在虚拟机环境下给Linux系统磁盘扩容 直接添加硬盘无法使用 还需要在系统内部有磁盘挂载操作 给虚拟机添加磁盘 查看系统盘分区类型 root Para110 fdisk dev sda 列出系统分区 欢迎使用 fd
  • springboot框架主要用来做什么?

    Spring Boot是一个开源的Java框架 主要用于简化和加速基于Java的应用程序的开发 它提供了一套开发工具和约定 使得构建独立 可执行的 生产级别的Spring应用变得更加容易 Spring Boot的主要目标是简化Spring应
  • 华夏相机/臻识相机车牌识别器同LED屏幕语音对接以及javaDemo

    上篇文章说过在本地买的华夏相机T83因为当地的销售人员只懂安装 一点技术支持也给不了 导致语音 屏幕 均不能实现自己想要的功能 自定义修改文字 语音播放余额等 经过自己进一步的研究发现 这个led屏幕和语音只需要自己买一块几十块的主板更换上
  • java类总结_Java类的高级用法总结

    马上就要进入10月中旬了 距离开学已经过去整整一个半月了 想想大四的学长学姐们的忙碌的生活 我似乎也感受到了他们内心的躁动 但要淡定 学东西就是要沉住气 今天先来梳理梳理Java类的高级用法 主要内容 1 final关键字 2 抽象方法及抽
  • Maven手动安装ojdbc7.jar

    这篇文章介绍了Springboot项目中通过maven引入与安装外部jar的方法与踩坑 因为版权原因 oracle的ojdbc jar 无法直接从maven 的中央仓库下载 需要手动进行下载安装 下载后选择一个指定位置 我这边选择 opt
  • matplotlib 直方图绘制详解

    n bins patches plt hist datasets bins normed False facecolor None alpha None 函数说明 用于绘制多个数据集datasets的直方图 主要形参 datasets 数据
  • GD32+ADC+DMA定时采集+acs712霍尔电流传感器

    GD32 ADC DMA定时采集 acs712霍尔电流传感器 目的 本文使用定时器定时触发adc采样 并且通过dma搬运数据 环境 KEIL GD32F107vct6 ADC01 IN5 PA5 TIMER3 CH3 时钟初始化 rcu p
  • js 实现左右移动

    底部工具栏左右控制js author tangw 2010 11 07 var RL RL defCount 6 arWindow startIndex 0 endIndex 5 currShowW up function 向上 var l
  • rsa2加解密及签名校验

    非对称加解密 第一种用法 私钥签名 公钥验签 用于签名 第二种用法 公钥加密 私钥解密 用于加解密 class Rsa2Controller extends Controller 第一种应用 验签 私钥加密 公钥验签 return stri
  • web开发资源

    1 http www cnblogs com lhb25 archive 2011 05 26 1997341 html 主要进行web开发 2
  • 洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles题解

    接触的第一道DP题 动态规划入门 题目描述 写一个程序来查找从最高点到底部任意处结束的路径 使路径经过数字的和最大 每一步可以走到左下方的点也可以到达右下方的点 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中 从