// 面试题47:礼物的最大价值
// 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
// (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
// 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
// 算你最多能拿到多少价值的礼物? #include <algorithm>
#include <iostream> int getMaxValue_solution1(const int* values, int rows, int cols)
//使用一个二维辅助空间
{
if (values == nullptr || rows <= || cols <= )
return ; int** maxValues = new int*[rows];//定义一个二维数组,用来存储当前位置最大值
for (int i = ; i < rows; ++i)
maxValues[i] = new int[cols]; for (int i = ; i < rows; ++i)
{
for (int j = ; j < cols; ++j)
{
int left = ;
int up = ; if (i > )//如果有
up = maxValues[i - ][j]; if (j > )
left = maxValues[i][j - ]; maxValues[i][j] = std::max(left, up) + values[i * cols + j];
}
} int maxValue = maxValues[rows - ][cols - ];//取出右下角最大值 for (int i = ; i < rows; ++i)//删除它们
delete[] maxValues[i];
delete[] maxValues; return maxValue;
} int getMaxValue_solution2(const int* values, int rows, int cols)
//空间优化,将二维辅助数组变为一维
{
if (values == nullptr || rows <= || cols <= )
return ; int* maxValues = new int[cols];
for (int i = ; i < rows; ++i)
{
for (int j = ; j < cols; ++j)
{
int left = ;
int up = ; if (i > )
up = maxValues[j]; if (j > )
left = maxValues[j - ]; maxValues[j] = std::max(left, up) + values[i * cols + j];//更新maxValues[j]值就好了
}
} int maxValue = maxValues[cols - ]; delete[] maxValues; return maxValue;
} // ====================测试代码====================
void test(const char* testName, const int* values, int rows, int cols, int expected)
{
if (getMaxValue_solution1(values, rows, cols) == expected)
std::cout << testName << ": solution1 passed." << std::endl;
else
std::cout << testName << ": solution1 FAILED." << std::endl; if (getMaxValue_solution2(values, rows, cols) == expected)
std::cout << testName << ": solution2 passed." << std::endl;
else
std::cout << testName << ": solution2 FAILED." << std::endl;
} void test1()
{
// 三行三列
int values[][] = {//看看秀儿的二维数组定义方法
{ , , },
{ , , },
{ , , }
};
int expected = ;
test("test1", (const int*)values, , , expected);
} void test2()
{
//四行四列
int values[][] = {
{ , , , },
{ , , , },
{ , , , },
{ , , , }
};
int expected = ;
test("test2", (const int*)values, , , expected);
} void test3()
{
// 一行四列
int values[][] = {
{ , , , }
};
int expected = ;
test("test3", (const int*)values, , , expected);
} void test4()
{
int values[][] = {
{ },
{ },
{ },
{ }
};
int expected = ;
test("test4", (const int*)values, , , expected);
} void test5()
{
// 一行一列
int values[][] = {
{ }
};
int expected = ;
test("test5", (const int*)values, , , expected);
} void test6()
{
// 空指针
int expected = ;
test("test6", nullptr, , , expected);
} int main(int argc, char* argv[])
{
test1();
test2();
test3();
test4();
test5();
system("pause");
return ;
}

《剑指offer》第四十七题(礼物的最大价值)的更多相关文章

  1. 《剑指offer》第二十七题(二叉树的镜像)

    // 面试题27:二叉树的镜像 // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. #include <iostream> #include "BinaryTree ...

  2. 《剑指offer》第十七题(打印1到最大的n位数)

    // 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...

  3. 《剑指offer》面试题47. 礼物的最大价值

    问题描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  4. 剑指offer第四章

    剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...

  5. 剑指Offer(三十七):数字在排序数组中出现的次数

    剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  6. 剑指Offer(二十七):字符串的排列

    剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  7. JS 剑指Offer(四) 从尾到头打印链表

    题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. 【剑指Offer】俯视50题之21 - 30题

    面试题21包括min函数的栈  面试题22栈的压入.弹出序列  面试题23从上往下打印二叉树  面试题24二叉搜索树的后序遍历序列  面试题25二叉树中和为某一值的路径  面试题26复杂链表的复制  ...

  10. 算法学习之剑指offer(四)

    题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...

随机推荐

  1. Docker学习笔记之编写 Docker Compose 项目

    0x00 概述 通过阅读之前的小节,相信大家对 Docker 在开发中的应用已经有了一定的了解.作为一款实用的软件,我们必须回归到实践中来,这样才能更好地理解 Docker 的实用逻辑和背后的原理.在 ...

  2. rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计

    非集群下,简单的说:- 如果是excl,则设置durability没有意义,因为不管服务器挂了还是客户端主动/被动断开了,队列都会自动删除.- auto-delete,其实可简单的认为是同理,即使非e ...

  3. 接口自动化(unittest)

    一.用例 TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到TestSuite中的 TestRunn ...

  4. 【TensorFlow】tf.nn.max_pool实现池化操作

    max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似 有些地方可以从卷积去参考[TensorFlow]tf.nn.conv2d是怎样实现卷积的? tf.nn.max_pool(va ...

  5. 盒子总结,文本属性操作,reset操作,高级选择器,高级选择器优先级,边界圆角(了解),a标签的四大伪类,背景图片操作,背景图片之精灵图

    盒子总结 ''' block: 设置宽高 1.没有设置宽,宽自适应父级的宽(子级的border+padding+width=父级的width) 2.没有设置高,高由内容撑开 设置了宽高 一定采用设置的 ...

  6. Android系统分区理解及分区目录细解【转】

    本文转载自:https://blog.csdn.net/u010001503/article/details/51853822 Android 通常有以下分区: System分区: 就是我们刷ROM的 ...

  7. Docker 入门指南——常用命令

    前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令. 基本概念 镜像 Image 镜像是一些打包好的已有的环境,可以被用来启动和创建容器 容器 Contai ...

  8. [POI2011]Garbage 欧拉回路

    [POI2011]Garbage 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2278 https://loj.ac/problem/216 ...

  9. (转)ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks

    ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks by KO ...

  10. Derek解读Bytom源码-protobuf生成比原核心代码

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...