《剑指offer》第四十七题(礼物的最大价值)
- // 面试题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》第四十七题(礼物的最大价值)的更多相关文章
- 《剑指offer》第二十七题(二叉树的镜像)
// 面试题27:二叉树的镜像 // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. #include <iostream> #include "BinaryTree ...
- 《剑指offer》第十七题(打印1到最大的n位数)
// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...
- 《剑指offer》面试题47. 礼物的最大价值
问题描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...
- 剑指offer第四章
剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- 剑指Offer(二十七):字符串的排列
剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- JS 剑指Offer(四) 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- 【剑指Offer】俯视50题之21 - 30题
面试题21包括min函数的栈 面试题22栈的压入.弹出序列 面试题23从上往下打印二叉树 面试题24二叉搜索树的后序遍历序列 面试题25二叉树中和为某一值的路径 面试题26复杂链表的复制 ...
- 算法学习之剑指offer(四)
题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...
随机推荐
- apache编译安装php后需要注意以下配置
安装后, 编辑apache配置文件 vi /usr/local/apache2/conf/httpd.conf 可以看到 LoadModule php7_module modules/libphp7. ...
- DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)
汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...
- TCP之 TIME_WAIT和CLOSE_WAIT 状态 的原因分析和处理
转自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http: ...
- linux配置powerline(bash/vim)美化
安装powerline需要pip 链接:https://pan.baidu.com/s/1Jc59VD35PYic2fTK5v8h1w 密码:otfp pip curl https://bootstr ...
- bzoj 2084 Antisymmetry - Manacher
题目传送门 需要高级权限的传送门 题目大意 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串. 问给定长度为$n$的一个01串有多少个子串是反对称的 ...
- centos 7.2 安装gitlab汉化
####################你如果搜到我的这个博客,你的系统得是centos 7的 80端口没有占用. QQ:1394466404 这个博客维护1年 #### 多地方第一个是百度 ...
- python --- 08 文件操作
一. 文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写 f.close( ) f.flu ...
- 纯注解方式配置spring+springMVC
1.新建类initConfig,继承AbstractAnnotationConfigDispatcherServletInitializer,并重写getRootConfigClasses().get ...
- Python3基础 list insert 在指定位置挤入一个元素
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Android系统更新防互刷功能实现与分析【转】
本文转载自:https://blog.csdn.net/huangyabin001/article/details/44465145 版权声明:本文为博主原创文章,未经博主允许不得转载. htt ...