1. // 面试题47:礼物的最大价值
  2. // 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
  3. // (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
  4. // 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
  5. // 算你最多能拿到多少价值的礼物?
  6.  
  7. #include <algorithm>
  8. #include <iostream>
  9.  
  10. int getMaxValue_solution1(const int* values, int rows, int cols)
  11. //使用一个二维辅助空间
  12. {
  13. if (values == nullptr || rows <= || cols <= )
  14. return ;
  15.  
  16. int** maxValues = new int*[rows];//定义一个二维数组,用来存储当前位置最大值
  17. for (int i = ; i < rows; ++i)
  18. maxValues[i] = new int[cols];
  19.  
  20. for (int i = ; i < rows; ++i)
  21. {
  22. for (int j = ; j < cols; ++j)
  23. {
  24. int left = ;
  25. int up = ;
  26.  
  27. if (i > )//如果有
  28. up = maxValues[i - ][j];
  29.  
  30. if (j > )
  31. left = maxValues[i][j - ];
  32.  
  33. maxValues[i][j] = std::max(left, up) + values[i * cols + j];
  34. }
  35. }
  36.  
  37. int maxValue = maxValues[rows - ][cols - ];//取出右下角最大值
  38.  
  39. for (int i = ; i < rows; ++i)//删除它们
  40. delete[] maxValues[i];
  41. delete[] maxValues;
  42.  
  43. return maxValue;
  44. }
  45.  
  46. int getMaxValue_solution2(const int* values, int rows, int cols)
  47. //空间优化,将二维辅助数组变为一维
  48. {
  49. if (values == nullptr || rows <= || cols <= )
  50. return ;
  51.  
  52. int* maxValues = new int[cols];
  53. for (int i = ; i < rows; ++i)
  54. {
  55. for (int j = ; j < cols; ++j)
  56. {
  57. int left = ;
  58. int up = ;
  59.  
  60. if (i > )
  61. up = maxValues[j];
  62.  
  63. if (j > )
  64. left = maxValues[j - ];
  65.  
  66. maxValues[j] = std::max(left, up) + values[i * cols + j];//更新maxValues[j]值就好了
  67. }
  68. }
  69.  
  70. int maxValue = maxValues[cols - ];
  71.  
  72. delete[] maxValues;
  73.  
  74. return maxValue;
  75. }
  76.  
  77. // ====================测试代码====================
  78. void test(const char* testName, const int* values, int rows, int cols, int expected)
  79. {
  80. if (getMaxValue_solution1(values, rows, cols) == expected)
  81. std::cout << testName << ": solution1 passed." << std::endl;
  82. else
  83. std::cout << testName << ": solution1 FAILED." << std::endl;
  84.  
  85. if (getMaxValue_solution2(values, rows, cols) == expected)
  86. std::cout << testName << ": solution2 passed." << std::endl;
  87. else
  88. std::cout << testName << ": solution2 FAILED." << std::endl;
  89. }
  90.  
  91. void test1()
  92. {
  93. // 三行三列
  94. int values[][] = {//看看秀儿的二维数组定义方法
  95. { , , },
  96. { , , },
  97. { , , }
  98. };
  99. int expected = ;
  100. test("test1", (const int*)values, , , expected);
  101. }
  102.  
  103. void test2()
  104. {
  105. //四行四列
  106. int values[][] = {
  107. { , , , },
  108. { , , , },
  109. { , , , },
  110. { , , , }
  111. };
  112. int expected = ;
  113. test("test2", (const int*)values, , , expected);
  114. }
  115.  
  116. void test3()
  117. {
  118. // 一行四列
  119. int values[][] = {
  120. { , , , }
  121. };
  122. int expected = ;
  123. test("test3", (const int*)values, , , expected);
  124. }
  125.  
  126. void test4()
  127. {
  128. int values[][] = {
  129. { },
  130. { },
  131. { },
  132. { }
  133. };
  134. int expected = ;
  135. test("test4", (const int*)values, , , expected);
  136. }
  137.  
  138. void test5()
  139. {
  140. // 一行一列
  141. int values[][] = {
  142. { }
  143. };
  144. int expected = ;
  145. test("test5", (const int*)values, , , expected);
  146. }
  147.  
  148. void test6()
  149. {
  150. // 空指针
  151. int expected = ;
  152. test("test6", nullptr, , , expected);
  153. }
  154.  
  155. int main(int argc, char* argv[])
  156. {
  157. test1();
  158. test2();
  159. test3();
  160. test4();
  161. test5();
  162. system("pause");
  163. return ;
  164. }

《剑指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. apache编译安装php后需要注意以下配置

    安装后, 编辑apache配置文件 vi /usr/local/apache2/conf/httpd.conf 可以看到 LoadModule php7_module modules/libphp7. ...

  2. DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)

    汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...

  3. TCP之 TIME_WAIT和CLOSE_WAIT 状态 的原因分析和处理

    转自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http: ...

  4. linux配置powerline(bash/vim)美化

    安装powerline需要pip 链接:https://pan.baidu.com/s/1Jc59VD35PYic2fTK5v8h1w 密码:otfp pip curl https://bootstr ...

  5. bzoj 2084 Antisymmetry - Manacher

    题目传送门 需要高级权限的传送门 题目大意 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串. 问给定长度为$n$的一个01串有多少个子串是反对称的 ...

  6. centos 7.2 安装gitlab汉化

    ####################你如果搜到我的这个博客,你的系统得是centos 7的   80端口没有占用.  QQ:1394466404   这个博客维护1年 #### 多地方第一个是百度 ...

  7. python --- 08 文件操作

    一.   文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写    f.close( ) f.flu ...

  8. 纯注解方式配置spring+springMVC

    1.新建类initConfig,继承AbstractAnnotationConfigDispatcherServletInitializer,并重写getRootConfigClasses().get ...

  9. Python3基础 list insert 在指定位置挤入一个元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. Android系统更新防互刷功能实现与分析【转】

    本文转载自:https://blog.csdn.net/huangyabin001/article/details/44465145 版权声明:本文为博主原创文章,未经博主允许不得转载.    htt ...