题目描述

在一个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. 查找nginx安装的路径

    你可以用这两个命令,找安装启用的路径 netstat -tnlp|grep nginx 然后看到一行记录,复制最后的一个数据(进程ID) ps -aux |grep 进程ID 就可以看到 NINGX的 ...

  2. MySQL主从同步机制及同步中的问题处理

    http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm

  3. 笨方法学python 22,前期知识点总结

    对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...

  4. English-英语学习杂志及资料

    [英文原版杂志] >>经济学人 英文原版PDF+双语版+文本音频 超全下载!http://bbs.zhan.com/thread-8443-1-1.html?sid=2004 >&g ...

  5. sping IOC和DI 初始化和关系

    springIOC和spring DI作为spring core的核心思想,有必要学习下才能更好的使用spring ========================================== ...

  6. Mongo 应用查询

    官网操作手册,基本就够用 https://docs.mongodb.com/manual/ 下面是个分组查询的例子,项目中用到然后查了个例子,自己理解了下,觉得很好很强大. https://blog. ...

  7. sendfile函数--零拷贝(转)

    零拷贝:零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道.实现高速服务器和路由器的关键技术之一. sendfile ...

  8. Linux:使用互斥量进行线程同步

    基础知识 同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数 ...

  9. Graylog日志管理系统---搜索查询方法使用简介

    Elasticsearch 是一个基于 Lucene 构建的开源.分布式.提供 RESTful 接口的全文搜索引擎 一.Search页面的各位置功能介绍: 1.日志搜索的时间范围 为了使用方便,预设有 ...

  10. [PHP]PHPOffice/PHPExcel数据导入方法

    ------------------------------------------------------------------------------------ /** * PHPExcel数 ...