题目描述:

如图所示,图中的橙色小方块就是传说中的作者,他可以在一个N*M的棋盘上行走,但是只有两个方向,一个是向右,一个是向下(如绿色箭头所示),棋盘上有很多的金矿,走到格子上就能取走那里的金矿,每个格子的金矿数目不同(用蓝色数字表示金矿的数量),问作者在这样一个棋盘上最多可以拿到多少金矿。

输入格式:

第一行3个整数:N,M,T,表示棋盘总共N行、M列、总共有T个金矿 (5<=N,M<=20,5<=T<=100)第二到T+1行,每行3个数据:x,y,num,表示位置(x,y)有num个金矿

输出格式:

总共可以挖的金矿数

限制:

空间限制:128MByte
时间限制:1秒

样例:

输入:3 3 5
1 3 1
2 1 1
2 2 2
2 3 3
3 1 2
输出:6

题目分析:

根据题意,我们很容易想到利用位置(x,y)作为状态结点,因为需要求解的是挖矿总数,我们使用全局变量来保存,构造搜索树如下:

dfs代码演示:

#include "iostream"
using namespace std;
void dfs(int x,int y,int sum);
int m,n,t;
int mg[21][21];
int maxx = 0;
int main(){cin>>m>>n>>t;int tempx,tempy,tn;for (int i = 1; i <=t ; ++i) {cin>>tempx>>tempy>>tn;mg[tempx][tempy] = tn;}dfs(1,1,mg[1][1]);cout<<maxx;
}
void dfs(int x,int y,int sum){if(x==m&&y==n){maxx = max(maxx,sum);return;}else{//向右x,y+1if(y+1<=n){dfs(x,y+1,sum+mg[x][y+1]);//重复计算,体会一下}//向下x+1,yif(x+1<=m){dfs(x+1,y,sum+mg[x+1][y]);//重复计算}}
}

我们观察搜索图,在搜索过程中,很多路径是重复搜索的,如图:

蓝色与黄色部分都是重复搜索路径,对于这些路径上的结点程序会做重复计算(累加结点上的金矿数);

叶子结点(3,3),重复结算的结果是一致的,都是0,不依赖全局

其他结点都可以由子结点计算得出,如(2,3)的计算结果可以由(3,3)的金矿数加上(2,3)的金矿数。

可以使用记忆化搜索来解决此题

我们定义一个全局的变量,保存每个结点计算结果

#include "iostream"
using namespace std;
int dfs(int x,int y);
int m,n,t;
int mg[21][21];
int ms[21][21];
int maxx = 0;
int main(){cin>>m>>n>>t;int tempx,tempy,tn;for (int i = 1; i <=t ; ++i) {cin>>tempx>>tempy>>tn;mg[tempx][tempy] = tn;}cout<<dfs(1,1);
}
int dfs(int x,int y){if(ms[x][y]){//结果是否出现过return ms[x][y];} else {if(x>m||y>n){return 0;}if(x==m&&y==n){//目标结点return mg[m][n];}else{//向右搜索int right = dfs(x,y+1);//向左搜索int down = dfs(x+1,y);ms[x][y] = mg[x][y] + max(right,down);//保存计算结果return ms[x][y];}}
}

当然,我自己也写啦:

代码如下:

#include<iostream>
using namespace std;
int dfs(int x,int y);
int m,n,t;
int mg[211][211];
int ms[211][211];
int maxx=0;
int main(){cin>>m>>n>>t;int tempx,tempy,tn;for (int i = 1; i <=t ; ++i) {cin>>tempx>>tempy>>tn;mg[tempx][tempy] = tn;}cout<<dfs(1,1);
}
int dfs(int x,int y){if(ms[x][y]){return ms[x][y];} else {if(x>m||y>n){return 0;}if(x==m&&y==n){return mg[m][n];}else{int right = dfs(x,y+1);int down = dfs(x+1,y);ms[x][y] = mg[x][y] + max(right,down);return ms[x][y];}}
}

挖金矿 详解(C++)相关推荐

  1. 超级棒的一个DP问题详解(入门)

    超级棒的一个DP问题详解(入门) 只要耐心看肯定可以理解的~动态规划问题故事描述~ 通过金矿模型介绍动态规划 附上原文地址: http://www.cnblogs.com/sdjl/articles/ ...

  2. Java经典面试题详解:Java字符串转成list

    阿里巴巴Java岗面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHas ...

  3. 【实战】MPLS单域通信过程详解

    一.背景说明 本文专门从路由传输与数据传输两个维度详细讲解传输的过程,上文实验拓扑如下图所示,为了简单起见,只已客户A为例(紫色)进行描述 二.路由传输层面 R5与R1之间通过ospf 1学习到5.5 ...

  4. Windows权限设置详解

    Windows权限设置详解 随着动网论坛的广泛应用和动网上传漏洞的被发现以及SQL注入式***越来越多的被使用,WEBSHELL让防火墙形同虚设,一台即使打了所有微软补丁.只让80端口对外开放的WEB ...

  5. Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)

    Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令) 原创 2017年03月01日 22:58:39 标签: 开发人员 / UAV / 软件 / 硬件 一.开篇 开源精神常在!!! 谁说软件 ...

  6. oracle 挖掘日志,Oracle 日志挖掘(LogMiner)使用详解

    Logminer依赖于2个包:DBMS_LOGMNR和DBMS_LOGMNR_D,Oracle 11g默认已安装 Logminer 基本使用步骤 <1>. Specify a LogMin ...

  7. SiamMask算法详解

    论文题目:Fast Online Object Tracking and Segmentation: A Unifying Approach 论文链接:论文链接 论文代码:代码链接 项目主页:项目链接 ...

  8. 转载爱哥自定义View系列--Paint详解

    上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...

  9. TCP/IP协议详解 卷一(阅读指导)

    1. 为了利用网络知识理解服务端网络架构.排查问题.解决问题. 真的没有必要背, wireshark 工具都给你解析的不能再细了.有没有重传,有没有乱序,数据包接收的时间,发送窗口多大,数据有没有拥塞 ...

  10. ThreadLocal知识点详解

    本文说下ThreadLocal的主要知识点 文章目录 概述 详解 小结 概述 ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境 ...

最新文章

  1. L1-009 N个数求和
  2. Android数据库高手秘籍(三)——使用LitePal升级表
  3. js闭包循环原因_常见的三个 JS 面试题
  4. ios8 Xcode6 设置Launch Image 启动图片
  5. JSTL标准标签库的国际化标签
  6. Echo Socket例子项目
  7. 算法提高 日期计算c语言,算法提高 日期计算
  8. mysql多表联查到新的表中_MySQL中的多表联查
  9. 禅道能连接数据库无法打开页面
  10. 微信开发--开发模式简单配置
  11. C++奥赛一本通排序题解
  12. 【推荐系统】推荐系统研究中常用的评价指标
  13. HCIE-Security Day31:IPSec:实验(六)配置PPPoE拨号分支与总部建立IPSec隧道示例
  14. mysql5.7 keepalived_基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构
  15. Windows下DOS操作系统(cmd)详解
  16. android T 前台Service
  17. 学习记录 Halcon 图片拼接
  18. Linux curl 命令模拟 POST/GET 请求
  19. 2014-人生旅途的节点
  20. 跨平台键鼠共享synergy和常见问题

热门文章

  1. 在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器
  2. iOS10 Xcode 8 中provisioning file 相关bug
  3. 终端安全求生指南(三)--脆弱性管理
  4. Linux下配置两个或多个Tomcat启动
  5. asp.net 无法访问已关闭的资源集
  6. Microsoft caffe(caffe-windows) cifar实例编译之model的使用
  7. EnglishWords——星期与月份
  8. Java To CSharp源代码转换
  9. I.MX6 CAAM
  10. 由DispatcherServlet看spring mvc请求处理过程