剑指Offer - 面试题47:礼物的最大价值

2023-10-27

题目

在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
例如,在下面的棋盘中,如果沿着带下画线的数字的路线(1、12、5、7、7、16、5)。那么我们能拿到最大价值为53的礼物。
在这里插入图片描述

分析

动态规划

我们创建一个等同棋盘的二维数组,每个位置用记录前一步到这一步的能拿到的最多价值。
如下图,每一步都是拿到的最多价值。空间复杂度为O(n2);
在这里插入图片描述
C++

#include <iostream>
using namespace std;
int getMaxValue_sonlution(const int* values, int rows, int cols)
{
	if (values == nullptr || rows <= 0 || cols <= 0)
		return 0;

	int** temp = new int*[rows];//用来存储每步的做大价值
	for (int i = 0; i < rows; ++i)
	{
		temp[i] = new int[cols];
	}

	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			//保存前一步的最大价值 max(values[i-1][j]与values[i][j-1])
			int maxnum = 0;	

			if (0 == i && 0 == j)	// 最开始
				;
			else if (0 == i)		// 到最上边
				maxnum = temp[i][j - 1];
			else if (0 == j)		// 到最左边
				maxnum = temp[i - 1][j];
			else
				maxnum = max(temp[i][j - 1], temp[i - 1][j]);

			temp[i][j] = values[i * cols + j] +  maxnum;
		}
	}

	int set = temp[rows - 1][cols - 1];

	for (int i = 0; i < rows; ++i)
	{
		delete[] temp[i];
	}
	delete[] temp;

	return set;
}

int main()
{
	int n[4][4] =
	{
		{1,10,3,8},
		{12,2,9,6},
		{5,7,4,11},
		{3,7,16,5}
	};
	int ret = getMaxValue_sonlution(n[0], 4, 4);
	cout << "能拿到最大价值的礼物:" << ret << endl;
}

在这里插入图片描述

优化动态规划
因为我们每次向下和向右移动,所以我们可以用一维数组代替上面的二维数组,
空间复杂度为O(n);
C++

#include <iostream>
using namespace std;
int getMaxValue_sonlution(const int* values, int rows, int cols)
{
	if (values == nullptr || rows <= 0 || cols <= 0)
		return 0;

	int* temp = new int[cols];//用来存储每步的做大价值

	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			//保存前一步的最大价值 max(values[i-1][j]与values[i][j-1])
			int maxnum = 0;	

			if (0 == i && 0 == j)	// 最开始
				;
			else if (0 == i)		// 到最上边
				maxnum = temp[j - 1];
			else if (0 == j)		// 到最左边
				maxnum = temp[j];
			else
				maxnum = max(temp[j - 1], temp[j]);
			temp[j] = values[i * cols + j] +  maxnum;
		}
	}

	int ret = temp[cols - 1];

	delete[] temp;

	return ret;
}

int main()
{
	int n[4][4] =
	{
		{1,10,3,8},
		{12,2,9,6},
		{5,7,4,11},
		{3,7,16,5}
	};
	int ret = getMaxValue_sonlution(n[0], 4, 4);
	cout << "能拿到最大价值的礼物:" << ret << endl;
}

在这里插入图片描述

本章完!

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

剑指Offer - 面试题47:礼物的最大价值 的相关文章

随机推荐

  • QRegExp

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • post使用方法以及有道API

    import requests import json headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML like Gecko
  • Unity人物前进的方向和相机朝向一致

    鼠标点击滑动移动相机 代码 using UnityEngine using System Collections This is an improved orbit script based on the MouseOrbitImprove
  • 数据结构-图的应用算法

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 最小生成树 1 1 Prim算法 1 2 Kruskal算法 二 最短路径 2 1 Dijkstra算法 2 2 Floyd算法 三 有向无环图描述表达式 四
  • Angular 使用MockJs

    今天要做模拟数据 但是发现没有说这个问题的帖子 特此记录分享一下 如果有用Angular的朋友刚好遇到这个问题 希望可以帮你解决 第一步 安装mockjs npm install mockjs save 第二步 引入mockjs 在 ang
  • Python学习笔记(十三)————循环语句相关

    目录 1 while循环 2 for循环 3 range语句 4 while与for区别 5 循环中断 break和continue 1 while循环 1 while的条件需得到布尔类型 True表示继续循环 False表示结束循环 2
  • 「OceanBase 4.1 体验」OceanBase 4.1社区版的部署及使用体验

    OceanBase 4 1 体验 OceanBase 4 1社区版的部署及使用体验 一 前言 1 1 本次实践介绍 1 2 本次实践目的 二 准备环境资源 2 1 部署前需准备工作 2 2 本地环境规划 三 部署Docker环境 3 1 安
  • 栈,堆,堆栈,队列

    堆栈都是一种数据项按序排列的数据结构 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 堆 顺序随意 栈 后进先出 Last In First Out 堆 什么是堆 又该怎么理解呢 堆通常是一个可以被看做一棵树的数组对象 堆总是满
  • ViewPager2 + SmartRefreshLayout + RecyclerView出现底部自动回弹显示问题,显示不全

    ViewPager2 SmartRefreshLayout RecyclerView出现底部自动回弹显示问题 显示不全 出现这个问题的原因是RecyclerView的高度超过了父控件的高度 我也不知道为啥 只是测试出来的结果 解决办法 pr
  • 【python基础知识】15.编码基础知识

    编码基础知识 前言 编码 二进制 编码表 encode 和decode 前言 在你的网络冲浪生涯里 我想你或多或少有这样的疑问 为什么传说中只能读懂0和1的计算机能显示如此五花八门的内容 为什么明明办的100兆的宽带 撑死就只有10几兆的下
  • ubuntu18.04 android studio无法使用中文输入法

    1 找到电脑安装的输入法框架 打开系统输入法 查看当前选择的输入法框架 这说明当前使用的是ibus 输入法框架 2 设置studio sh 使用输入法框架 在studio sh 的文件注释行下面 该文件的最前明 添加输入法 export X
  • iOS获取App ipa包 2019-02-12

    转自 https www jianshu com p 8eaa1dd20370 首先 去Mac上的App Store下载Apple Configurator 2 然后把iphone连接上Mac 点击Apple Configurator 2
  • 汽配企业WMS系统:提升作业效率与过程管控

    随着汽配企业竞争的加剧和业务模式的复杂化 许多企业意识到提高仓库作业效率和成本控制能力是企业成功的关键 因此 越来越多的企业选择引入WMS仓储管理系统 然而 汽配企业产品复杂 且从业的人员大部分是老一辈人员 内部信息化程度低 因此需要建立更
  • 代码随想录算法训练营第一天

    LeetCode704 力扣 基础二分法 考虑如何不让数据溢出 区间如何切换 LeetCode34 力扣寻找最左区间 和 最右区间 套路和基础二分法类似 就是要在找到target的时候继续向左或者向右移动 package algor tra
  • Matlab绘制折线图及局部放大图

    Matlab可完成折线图绘制及局部放大 需下载 MATLAB 交互式的局部放大图 知乎 代码开源 非常好用 十分感谢 需求 如下图所示 一 仅绘制折线图 代码如下 x 1 10 x轴上的数据 开始 终止值 a 12008 68032 171
  • Java手写LinkedList和拓展

    Java手写LinkedList和拓展 思维导图 mermaid svg K0RTlFFvnikDRvqp font family trebuchet ms verdana arial sans serif font size 16px f
  • 部署农产品溯源系统的步骤

    系统模块和技术 此系统有四个模块 blockchain trace bcnetwork blockchain trace applets blockchain trace pc blockchain trace basic data 本系统
  • [YOLO专题-4]:YOLO V1 - 网络结构、原理、基本思想的全新、全面、通俗、结构化讲解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122156426 目录 第1章 YOL
  • 小程序中的webSocket介绍以及使用

    什么是 webStoket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 WebSocket 使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 在 WebSocke
  • 剑指Offer - 面试题47:礼物的最大价值

    题目 在一个m n的棋盘的每一格都放有一个礼物 每个礼物都有一定的价值 价值大于0 你可以从棋盘的左上角开始拿格子里的礼物 并每次向左向下移动一格 直到到达棋盘的右下角 给定一个棋盘及其上面的礼物 请计算你最多能拿到多少价值的礼物 例如 在