当前位置: 首页 > news >正文

头歌 | 获取最多金币

题目描述

有一个 N x N 的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。

输入输出格式

输入格式

第一行有一个整数 N。
之后 N 行有 N 个整数,表示数组数组的所有元素,每个整数用一个空格隔开。

输出格式

一个整数。

输入输出样例1

输入

1
3

输出

3

输入输出样例2

输入

3
1 3 3
2 2 2
3 1 2

输出

11

说明提示

1≤n≤1000

思路

由于要使用动态规划来解决。

首先,我们要创建两个二维数组,一个是存地图的,一个是存sumres数组。

res数组在最开始要将第0行和第0列设为0,表示在尚未计算时,sum的初始值为0

然后,在设置一个函数int f(int i, int j)用于更新res数组的res[i][j]

f函数的代码如下:

void f(int i, int j) {res[i][j] = res[i][j-1]+a[i][j] > res[i-1][j]+a[i][j]? res[i][j-1]+a[i][j]: res[i-1][j]+a[i][j];maxN = maxN < res[i][j]? res[i][j]: maxN;
}

f函数表示的意思是res[i][j]res[i][j-1]+a[i][j]res[i-1][j]+a[i][j]二者之一的最大值。

接着,就是说一下程序中函数res数组的更新顺序,是从左到右逐层运行。

最终成果如下:

在这里插入图片描述

Code

#include <bits/stdc++.h>
using namespace std;
int res[1001][1001] = {0}, a[1001][1001] = {0}, maxN = 0;void f(int i, int j) {res[i][j] = res[i][j-1]+a[i][j] > res[i-1][j]+a[i][j]? res[i][j-1]+a[i][j]: res[i-1][j]+a[i][j];maxN = maxN < res[i][j]? res[i][j]: maxN;
}int main() {int n;cin >> n;for(int i = 0; i <= n; ++i) {res[i][0] = res[0][i] = 0;}for(int i = 1; i <= n; ++i) {for(int j = 1; j <= n; ++j) {cin >> a[i][j];}}for(int i = 1; i <= n; ++i) {for(int j = 1; j <= n; ++j) {f(i, j);}}cout << maxN;
}

http://www.mrgr.cn/news/44857.html

相关文章:

  • msvcp100.dll丢失怎样修复,6招轻松解决msvcp100.dll丢失问题
  • 在单位里,这6点人情世故一定要谨记
  • 机器学习——大规模语言模型与生成模型
  • BLE MESH学习1-基于沁恒CH582学习
  • 跨平台游戏的特点
  • 【优选算法】---分治 归并排序
  • VGG16模型实现MNIST图像分类
  • 第十四篇——无穷:我们为什么难以理解无限的世界?
  • AtCoder ABC374 A-D题解
  • 解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南
  • 【ubuntu】ubuntu20.04安装显卡驱动
  • CSRF | POST 型 CSRF 漏洞攻击
  • Vue入门-使用Vue2完成简单的记事本Demo
  • Python | 由高程计算坡度和坡向
  • 从零开始打造华丽的国庆生活记录本地HTML网站
  • 栈基址寄存器、页基址寄存器、程序计数器
  • window 安装永洪BI Desktop版本教程
  • 2024.09.24 校招 实习 内推 面经
  • 用java编写飞机大战
  • 机器学习西瓜书笔记(十四) 第十四章概率图模型