挖金矿 详解(C++)
题目描述:
如图所示,图中的橙色小方块就是传说中的作者,他可以在一个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++)相关推荐
- 超级棒的一个DP问题详解(入门)
超级棒的一个DP问题详解(入门) 只要耐心看肯定可以理解的~动态规划问题故事描述~ 通过金矿模型介绍动态规划 附上原文地址: http://www.cnblogs.com/sdjl/articles/ ...
- Java经典面试题详解:Java字符串转成list
阿里巴巴Java岗面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHas ...
- 【实战】MPLS单域通信过程详解
一.背景说明 本文专门从路由传输与数据传输两个维度详细讲解传输的过程,上文实验拓扑如下图所示,为了简单起见,只已客户A为例(紫色)进行描述 二.路由传输层面 R5与R1之间通过ospf 1学习到5.5 ...
- Windows权限设置详解
Windows权限设置详解 随着动网论坛的广泛应用和动网上传漏洞的被发现以及SQL注入式***越来越多的被使用,WEBSHELL让防火墙形同虚设,一台即使打了所有微软补丁.只让80端口对外开放的WEB ...
- Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)
Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令) 原创 2017年03月01日 22:58:39 标签: 开发人员 / UAV / 软件 / 硬件 一.开篇 开源精神常在!!! 谁说软件 ...
- oracle 挖掘日志,Oracle 日志挖掘(LogMiner)使用详解
Logminer依赖于2个包:DBMS_LOGMNR和DBMS_LOGMNR_D,Oracle 11g默认已安装 Logminer 基本使用步骤 <1>. Specify a LogMin ...
- SiamMask算法详解
论文题目:Fast Online Object Tracking and Segmentation: A Unifying Approach 论文链接:论文链接 论文代码:代码链接 项目主页:项目链接 ...
- 转载爱哥自定义View系列--Paint详解
上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...
- TCP/IP协议详解 卷一(阅读指导)
1. 为了利用网络知识理解服务端网络架构.排查问题.解决问题. 真的没有必要背, wireshark 工具都给你解析的不能再细了.有没有重传,有没有乱序,数据包接收的时间,发送窗口多大,数据有没有拥塞 ...
- ThreadLocal知识点详解
本文说下ThreadLocal的主要知识点 文章目录 概述 详解 小结 概述 ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境 ...
最新文章
- L1-009 N个数求和
- Android数据库高手秘籍(三)——使用LitePal升级表
- js闭包循环原因_常见的三个 JS 面试题
- ios8 Xcode6 设置Launch Image 启动图片
- JSTL标准标签库的国际化标签
- Echo Socket例子项目
- 算法提高 日期计算c语言,算法提高 日期计算
- mysql多表联查到新的表中_MySQL中的多表联查
- 禅道能连接数据库无法打开页面
- 微信开发--开发模式简单配置
- C++奥赛一本通排序题解
- 【推荐系统】推荐系统研究中常用的评价指标
- HCIE-Security Day31:IPSec:实验(六)配置PPPoE拨号分支与总部建立IPSec隧道示例
- mysql5.7 keepalived_基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构
- Windows下DOS操作系统(cmd)详解
- android T 前台Service
- 学习记录 Halcon 图片拼接
- Linux curl 命令模拟 POST/GET 请求
- 2014-人生旅途的节点
- 跨平台键鼠共享synergy和常见问题