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

头歌 | 获取最多金币

题目描述

有一个 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.kler.cn/news/336728.html

相关文章:

  • rabbitmq----数据管理模块
  • 智能视界·大模型驱动视频矩阵管理系统
  • Anaconda的安装与环境设置
  • Android车载——VehicleHal初始化(Android 11)
  • MATLAB计算与建模常见函数:2.回归模型
  • 计算机视觉中的3D变换:让虚拟与现实无缝对接
  • CSS给一行按钮统一设置间隔
  • 【代码实现】torch实现F.pixel_shuffle和F.pixel_unshuffle
  • guava里常用功能
  • 强化学习笔记之【Q-learning算法和DQN算法】
  • 区块链的编程语言有那些?
  • 基于STM32的智能垃圾桶控制系统设计
  • wordpress父分类和归档页调用子分类名称和链接
  • can 总线入门———can简介硬件电路
  • html+css+js实现Collapse 折叠面板
  • [运维]5.镜像本地存在但仍然从网络拉取的问题
  • Qt 6 相比 Qt 5 的主要提升与更新
  • Java基础-单例模式的实现
  • Android Codec2 CCodec(十六)C2AllocatorGralloc
  • 241006-Gradio中Chatbot通过CSS自适应调整高度