题目描述

在一个m*n的棋盘每个格有一个礼物,每个礼物有一定价值(>0)。从棋盘左上角到右下角,只能向下或向右走,问能拿到的礼物最大价值。

解题思路

dp。

可将二维数组版优化为一维数组版。

代码

一维数组版

#include <iostream>
using namespace std; int maxSum(int* val,int rows,int cols){
if(!val||rows<=0||cols<=0){
return -1;
} int dp[cols];
memset(dp, 0, sizeof(dp)); for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(i==0&&j==0){
dp[j]=val[i*cols+j];
}
else if(i==0){
dp[j]=dp[j-1]+val[i*cols+j];
}
else if(j==0){
dp[j]=dp[j]+val[i*cols+j];
}
else{
dp[j]=max(dp[j],dp[j-1])+val[i*cols+j];
}
}
}
return dp[cols-1];
} int main(int argc, const char * argv[]) {
int val[]={1,2,3,4,5,6};
int rows=2;
int cols=3;
int* pVal=val;
int sum=maxSum(pVal, rows, cols);
cout<<sum<<endl;
return 0;
}

二维数组版

#include <iostream>
using namespace std; int maxSum(int* val,int rows,int cols){
if(!val||rows<=0||cols<=0){
return -1;
} int dp[rows][cols];
memset(dp, 0, sizeof(dp)); for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(i==0&&j==0){
dp[i][j]=val[i*cols+j];
}
else if(i==0){
dp[i][j]=dp[i][j-1]+val[i*cols+j];
}
else if(j==0){
dp[i][j]=dp[i-1][j]+val[i*cols+j];
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+val[i*cols+j];
}
}
}
return dp[rows-1][cols-1];
} int main(int argc, const char * argv[]) {
int val[]={1,2,3,4,5,6};
int rows=2;
int cols=3;
int* pVal=val;
int sum=maxSum(pVal, rows, cols);
cout<<sum<<endl;
return 0;
}

[剑指Offer]47-礼物的最大价值(DP)的更多相关文章

  1. 力扣 - 剑指 Offer 47. 礼物的最大价值

    题目 剑指 Offer 47. 礼物的最大价值 思路1 因为是要求最大价值,而且只能移动下方或者右方,因此,每个位置的最大值就是本身的值加上上边 / 左边 中的最大值,然后每次遍历都可以复用上一次的值 ...

  2. 【Java】 剑指offer(47) 礼物的最大价值

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值( ...

  3. 每日一题 - 剑指 Offer 47. 礼物的最大价值

    题目信息 时间: 2019-07-02 题目链接:Leetcode tag:动态规划 难易程度:中等 题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0). ...

  4. 剑指 Offer 47. 礼物的最大价值

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

  5. 剑指offer——49礼物的最大价值

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

  6. 剑指Offer 47. 求1+2+3+...+n (其他)

    题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 题目地址 https://www.nowcod ...

  7. [剑指Offer] 47.求1+2+3+...+n

    题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). [思路]用&&的短路思想来求和 ...

  8. 剑指offer——47把数组排成最小的数

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.   题解: ...

  9. 剑指offer二刷(精刷)

    剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次. ...

随机推荐

  1. Netty - 3 内存分配

    https://www.cnblogs.com/gaoxing/p/4253833.html netty的buffer引入了缓冲池.该缓冲池实现使用了jemalloc的思想 内存分配是面向虚拟内存的而 ...

  2. LeetCode 312. Burst Balloons(戳气球)

    参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/art ...

  3. 【367】通过 python 实现 SVM 硬边界 算法

    参考: 支持向量机整理 SVM 硬边界的结果如下: $$min \quad \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_jy_iy_j \v ...

  4. Oracle重建表空间操作实例

    由于环境维护或者性能测试需要,经常需要对表空间进行重建操作.重建表空间操作主要分3中情况介绍,分别是业务表空间.临时表空间和回滚段表空间的重建. 重建业务表空间 由于业务规划要求,重建后的业务表空间名 ...

  5. [Shell]Bash基本功能:历史命令 & 别名 & Bash快捷键

    /*----------------------------------------------------------------------------------------------- @黑 ...

  6. Java基本语法知识要点

    0x00   一个源文件中有多少个类,在用javac编译后,在同一目录下将产生多少个对应的字节码文件(.class ).类里面不一定要有public static void main(String[] ...

  7. LINUX系统一一常用命令

    前言 LINUX UNIX Centos RedHat Ubuntu SHELL shell脚本 shell shell命令 类似windows系统的bat 批处理文件 里面都是脚本 CentOS6. ...

  8. spring使用中ModelAttribute的内容被覆盖

    在前台以get方式向后台提交数据: 后台接收: 后台接收参数的时候,由于user里面也有一个属性为id,后台在接收参数的时候,User里面的id会被重新赋值,这是一个大坑.如果后续继续用User来做操 ...

  9. Android签名

    参考文档:http://blog.csdn.net/u010316858/article/details/53159678 http://www.cnblogs.com/wanqieddy/p/355 ...

  10. ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减

    ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:手动编辑擦除.挖空.挖除.相减 1. 选中内部要素 2. c ...