最近在学动态规划,很有意思的算法(1)拿金币

2023-11-18

问题描述
  有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。
你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。
请问如何走才能拿到最多的金币。
输入格式
  第一行输入一个正整数n。
  以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
  最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
  n<=1000

自己的一些笔记:

动态规划DP:  确定二维数组大小为n*n,将金币数字存入nums[n][n]。观察题目,可以建立二维数组
存储累加最大金币数目,称为dp[i][j],其中i、j表示当前所在格子的行和列。
1、确定初始范围:从左上角开始走,规定只能往右边或者下面走,确定最左上角为初始值,
令dp[0][0] = nums[0][0];
    如下图所示,可以一层一层往里面深入,dp存储最大金币路径。首先是最外层的最左边的一列,
因为不能往左边走,因此如果出现在最左边的一列,那一定是径直往下走的,而不是先走到了右边又拐回来的,
因此可以用dp[i][0] = dp[i - 1][0] + nums[i][0]表示最左边的一列的状态值,
当前状态等于上一个状态(前面的路径上所有金币之和)加现在格子里的金币数。
    同样地,最上面一行也是如此,因为走到最上面的格子里也只能横着走,因此用
dp[0][i] = dp[0][i - 1] + nums[0][i]表示最上面一行当前状态的金币之和
(最大金币数——只有一条路,也不得不最大)。
2、状态转移函数:写状态转移函数,就是找从一个阶段向另一个阶段过度的具体形式,
描述的是两个相邻子问题之间的关系(递推式)。
例如黄格子A,A可由B和C走过来,要求最大的金币数量之和,就看B和C哪个存储的“路径金币之和”最大,
(dp的每个格子存储的是当前路径金币之和最大值),B和C都是存储的走到该格路径金币最大的数值,
现在要求A,就看B和C哪个大,哪个大就加上A的金币数目作为到A点的路径金币之和最大值。
因此i和ji都从1开始,用dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + nums[i][j]表示
最优子结构,表示当前路径金币之和最大值。
    上述示意图看蓝桥杯收藏夹对应CSDN
'''
# 我的代码:
n=int(input())
nums=[[list(map(int,input().split()))]for i in range(n)] # 这样更好
dp=[[0 for i in range(n)]for j in range(n)] # 注意本题dp[][]定义格式
dp[0][0]=nums[0][0] # 赋初始值
for i in range(n):
    for j in range(n):
        if i==0:
            dp[0][i]=dp[0][i-1]+nums[0][i]
        elif j==0:
            dp[j][0]=dp[j-1][0]+nums[i][0]
        else:
            dp[i][j]=max(dp[i-1][j],dp[i][j-1])+nums[i][j]
print("{:.d}".format(dp[n-1][n-1]))
'''
# 正确代码:
n = int(input()) # 确定矩阵大小
a = [[] for i in range(n)] # 创建空矩阵
for i in range(n): # 金币初始化
    a[i] = list(map(int, input().split()))
for i in range(n): # 拿金币三种处理
    for j in range(n):
        if i == 0 and j == 0:
            a[i][j] = a[i][j]
        elif i == 0:
            a[i][j] = a[i][j - 1] + a[i][j]
        elif j == 0:
            a[i][j] = a[i - 1][j] + a[i][j]
        else:
            a[i][j] = a[i][j] + max(a[i - 1][j], a[i][j - 1])
print(a[n - 1][n - 1])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最近在学动态规划,很有意思的算法(1)拿金币 的相关文章

随机推荐

  • chatgpt赋能python:如何用Python求和

    如何用Python求和 Python是一种高级编程语言 最初设计用于简单的脚本编写 但是也可以用于复杂的科学计算 求和是我们在编程中经常需要处理的基本操作之一 Python具有简单易学的语法和广泛的开源库 使其成为处理数据的强大工具 在本文
  • 2022CISCNmisc

    ez usb 题目已经告诉是usb流量 一共有三个地址2 8 2 10 2 4但2 4没用 我们分别导出2 8和2 10 从网上搜usb脚本将他们两个分别解出来 将那一打穿放到010发现是个rar文件 但是损坏了打不开 可以用winrar修
  • bp神经网络的训练方法,一文搞定bp神经网络

    BP人工神经网络方法 一 方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统 理论和实践表明 在信息处理方面 神经网络方法比传统模式识别方法更具有优势 人工神经元是神经网络的基本处理单元 其接收的信
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • mysql高可用分库分表ShardingSphere之Sharding-proxy

    文章目录 一 ShardingSphere 1 1 官网地址说明 1 2 为什么分库分表 二 官网整合说明 1 1 下载sharding proxy 1 2 sharding proxy集成注册中心 1 3 查看配置手册 1 3 1 官网数
  • C++ 快速排序

    快速排序是比较常用的一种排序 平均时间复杂度为O nlogn 最坏的时间复杂度为O n 话不多说 上代码 include
  • [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章开启了新的内容 Bert 首先介绍Keras bert库安装及基础用法 这将为后续文本分类 命名实体识别提供帮助 这篇文章将通过keras bert库构建
  • 【C++】异常

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 异常 1 C语言处理异常的方式 2 C 处理异常的方式
  • MyBatis 中if 标签 判断字符串不生效

    今天遇到if 标签判断字符串不生效 导致查询结果错误 异常sql 的mapper 文件
  • Ubuntu14.04安装ssh实现远程登陆

    Ubuntu14 04安装ssh实现远程登陆 安装 sudo apt get install y ssh 修改ubuntu的ip地址和PC在同一网段内 配置 sudo gedit etc ssh sshd config 修改成如下设置 重启
  • C++给变量起别名

    以下代码展示给变量a取一个别名b 两者指向同一个内存空间位置 改变b a也会相应改变 include
  • AR模型脱卡,unity端实现步骤详情

    AR模型脱卡unity端实现具体步骤 AR模型脱卡的原理 利用一些unity端AR插件做AR应用 通常会有一个需求 当识别物消失的时候 将3D模型从识别物这个父物体上移除 显示在屏幕中央 那么原理就显而易见了 就是在识别物追踪方法中 写一些
  • Pytorch固定部分参数(只训练部分层)

    参考 https www cnblogs com jiangkejie p 11199847 html 在迁移学习中我们经常会用到预训练模型 并在预训练模型的基础上添加额外层 训练时先将预训练层参数固定 只训练额外添加的部分 完了之后再全部
  • 字节对齐和字节序

    1 字节对齐 1 什么是字节对齐 内存空间是按字节划分 理论上可以从任意起始地址访问任意类型的变量 但实际上在访问特定类型变量是经常在特定的内存地址访问 这就需要各种数据类型按照一定的规则进行排列 而不是一个接一个紧接着排放 简单的讲就是数
  • C++拷贝构造函数—类临时对象的构建与析构

    一 对象的概念 对象的基本概念 我们最开始学习数据类型的时候 我们会学到 int a 10 这种写法 这种写法是数据类型 标识符的形式 标识符来给我们程序运行中需要使用到的内存空间取名字 这个标识符一般指的是变量 而利用常量来对我们向系统申
  • 针对“PL2303HXA自2012已停产,请联系供货商”问题的解决办法

    连接nanopi友善之臂时遇到这种情况 首先尝试更新驱动程序 在更新驱动程序后当时可以正常用putty连接板子 但在第二天又出现了这个问题 其实就是驱动程序太新了 安装旧版驱动程序就可以 查看现在的驱动程序版本 是2021年的 打开设备管理
  • 全网最详细中英文ChatGPT-GPT-4示例文档-语句情绪分类从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    从0到1快速入门语句情绪分类应用场景 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node js接口请求示例 cu
  • android从一个应用跳转到另一个应用

    获取launcher中的应用列表 Intent intent new Intent intent setAction Intent ACTION MAIN intent addCategory Intent CATEGORY LAUNCHE
  • 奇异谱分解轴承故障诊断代码编写

    答 我可以为您提供一些建议 以帮助您编写奇异谱分解轴承故障诊断代码 1 首先 要确定故障类型 以便确定诊断策略 2 然后 可以使用多种故障诊断技术 包括奇异谱分析 以及其他故障诊断技术 3 为了更好地掌握故障特征 可以使用相关的轴承数据库
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方