fzu 2092 收集水晶(记忆化搜索(dp),dfs)(也可以用bfs)

POJ1252 完全背包 dp 搜索 dfs bfs 今天见到一道不错的水题,但是卡了我两次,是道完全背包,也可以用搜索,因为刚刚开始练习背包,可谓入门,感觉这是道不错的题,就用dp小试一下。 连接:http://poj.org/problem?id=1252 题目大意:给6种不同面额硬币,求组成[1,100]中数的平均需要硬币与最多需要硬币数,可以通过减法获得,比如有1、4两种硬币,凑成3可以用4-1两个硬币完成,而不是1+1+1三个硬 阅读详情

dp与其说是一种算法,不如说是一种思想。
而记忆化搜索运用了这种思想,即记忆化搜索的实质是dp。它结合了dp与搜索的优点,在搜索的基础上记录每个状态“是否已经计算过”,以此提高效率。
一般说来,dp总要遍历所有的状态,而搜索可以排除一些无效状态。
更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
也可以这样理解,将dp作为一种问题求解方法,记忆化搜索的方法可以计算状态转移方程。

总结起来:
记忆化搜索就是保证搜过的不再搜。
这是dp的一个出发点。
一个问题,如果阶段好划分,状态好确定。很多用递推来写。
如果阶段不好划分,或者说对于拓扑关系很复杂的dp,很多就用记忆化搜索来写。

回到这个题,开始看到影流之主(雾)找宝石(骑士),两个人的搜索。我在想是不是双向搜索,后来看到是找val水晶,就知道这肯定是个dp。
这里v相对较大,nm相对较小。命题人应该是考虑让我们用记忆化搜索。

dp[11][11][11][11][205]定义为两个人分别从两个位置,第t秒出发所获得的最大值。(也就是状态)。
注意,这里不能开太大,之前就是开到[20][20][20][20][210]就mle了。

值得注意的是移动方式有5种。
(1,0)(-1,0)(0,1)(0,-1)(0,0)

if (dp[dx1][dy1][dx2][dy2][t]!=-1) return dp[dx1][dy1][dx2][dy2][t];

记忆化搜索体现

还有一个小问题就是要想到注意越界,数据中有两个水晶在同一时间同一位置的。(出题人简直蛇精病好吧)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
        int dir[5][2]= {1,0,-1,0,0,1,0,-1,0,0};
int dp[11][11][11][11][205];
int val[11][11][205];
char map[11][11];
int n,m;
int dfs(int dx1,int dy1,int dx2,int dy2,int t)
{
    int dx3,dy3,dx4,dy4;
    if (t>200) return 0;
    if (dx1<0 || dx1>=n || dy1<0 || dy1>=m) return 0;
    if (dx2<0 || dx2>=n || dy2<0 || dy2>=m) return 0;
    if (map[dx1][dy1]=='#' || map[dx2][dy2]=='#') return 0;
    if (dp[dx1][dy1][dx2][dy2][t]!=-1) return dp[dx1][dy1][dx2][dy2][t];
    int tmp = 0,mx = 0;
    for (int i=0; i<5; i++)
    {

        for (int j=0; j<5; j++)
        {
            dx3=dx1+dir[i][0];
            dy3=dy1+dir[i][1];
            dx4=dx2+dir[j][0];
            dy4=dy2+dir[j][1];
            tmp=dfs(dx3,dy3,dx4,dy4,t+1);
            if (tmp>mx) mx=tmp;
        }
    }
    dp[dx1][dy1][dx2][dy2][t]=mx;
    if (dx1==dx2 && dy1==dy2) dp[dx1][dy1][dx2][dy2][t]+=val[dx1][dy1][t];
    else
        dp[dx1][dy1][dx2][dy2][t]+=val[dx1][dy1][t]+val[dx2][dy2][t];
    return dp[dx1][dy1][dx2][dy2][t];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(dp,-1,sizeof(dp));
        memset(val,0,sizeof(val));
       // memset(map,NULL,sizeof(map));
        cin>>n>>m;
        getchar();
        for(int i=0; i<n; i++)
            gets(map[i]);
        int p;
        cin>>p;
        while(p--)
        {
            int k,x,y,v;
            cin>>k>>x>>y>>v;
            val[x-1][y-1][k]+=v;
        }
        cout<<dfs(0,0,0,0,0)<<endl;
    }
}
《阵列信号处理及MATLAB实现》阵列响应矩阵(均匀线阵、均匀圆阵、L型阵列、平面阵列和任意阵列) 《阵列信号处理及MATLAB实现》内容总结,如需阅读更详细内容请购买正版书籍。 阅读详情

相关推荐

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

算法复习五【BFS、DFS、DP】

12、宽度优先搜索 bfs采用的是queue队列,把搜到的都放入,只要queue不为空就继续把搜到的结果继续搜索 小岛问题: ①先创建一个isvisited的二维数组用来存该坐标是否被访问过 ②如果没有访问过,且为数值为1的可做一个小岛 ③然后对该点进行bfs宽搜,只要是与它接壤的都改为访问过 bfs函数的内容: bfs宽搜利用的是queue,每搜到一个就往queue添加,然后取出来就行对该点进行搜查。 先是对传入的点搜查,利用k的四个值,找出该点上下左右坐标,看看有没有越界,有没有访问过,是否为1,如果符

Ben的博客 1292

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3073

C++ 路径问题汇总 涉及DP, DFS, BFS和回溯

最近这几天忙着参加各大互联网公司的笔试, 发现有一个规律, 算法题都喜欢出路径问题, 二维数组作为地图, 从(0,0)点到(m-1,n-1)点最短花费, 至少删除多少个障碍才能够到达等等, 总之就是二维数组找路径, 其中有不同的障碍物, 不同的分值, 总之八仙过海各显神通, 可能是因为涉及到很多的知识, 因此大家都乐意出这样的题吧; 今天小弟在这里献上收集来的各种题型和解题思路 1. 广度优先搜索和优先队列配合 不同道路不同消费并且含有障碍物, 问从(0,0)到(m-1, n-1)的最低消费, 注意:

406156440的博客 3235

外设高级定时器互补输出带死区控制实验

外设高级定时器互补输出带死区控制实验

ff_juju的博客 1653

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1030

力扣62不同路径——dp(一维与二维),dfs,bfs三种解法

题目链接:https://leetcode-cn.com/problems/unique-paths/ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 向右 ->

m0_52103105的博客 290

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

力扣精选题——单词拆分(dp+dfs+dfs(备忘录)+bfs+bfs(备忘录))

一道题通过动态规划,深搜,深搜+备忘录,广搜,广搜+备忘录五种方法来分析

wys74230859的博客 516

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1288

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

【DP/DFS/回溯/BFS等】链接汇总

【LC 1896】 我只想到了从正面的角度,没想到换个角度去做。 换个角度的时候我也过于纠结1~n不是连续的,而实际上只要看是不是最高的就可以。 所以说这个题非常好。https://leetcode.com/problems/number-of-ways-to-rearrange-sticks-with-k-sticks-visible/discuss/1211070/C%2B%2B-Detailed-Explanation-with-Thought-Process-or-DP ...

u014040446的博客 1305

【Python爬虫(1)】专栏开篇:夯实Python基础

要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。

邓邓子的博客 2026

FZU2092-收集水晶

Problem 2092 收集水晶 Accept: 131    Submit: 532 Time Limit: 5000 mSec    Memory Limit : 32768 KB  Problem Description shadow来到一片神奇的土地,这片土地上不时会出现一些有价值的水晶,shadow想要收集一些水晶带回去,但是这项任务太繁杂了,于是shadow让

wang_128的博客 494

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

滑雪——DFS,BFS_DP记忆化搜索

[SHOI2002] 滑雪。

m0_72522122的博客 304

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

7月17号:完全背包问题例题,322. 零钱兑换:DP,DFS,BFS

今天的每日一练很没意思,就不说了 主要是来复习一遍昨天的 322. 零钱兑换 用dfs和bfs来解决: 首先是非递归的bfs: class Solution: def coinChange(self, coins: List[int], amount: int) -> int: #简单bfs if amo...

weixin_40857308的博客 299

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【动态规划】LeetCode - 139. 单词拆分——DFS、BFS、DP

139. 单词拆分 题目描述 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = “leetcode”, wordDict = [“leet”, “code”] 输出: true 解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。 示例 2: 输入: s = “applepenapple”

your_棒棒糖的博客 358

算法 14.水晶问题

算法 14.水晶问题

c_h_q_的博客 943

hdu 3681 Prison Break (状态压缩dp/dfs + bfs)

题意:一幅矩阵迷宫,給起点,开始时充满电,要求是遍历给定的点,每移动一次花费1, 迷宫中有若干充电池可充满电(每个充电池只能用一次),求原始电量最少是多少。 分析: 1、由于所有'Y'处一定要走到,‘G'可以走也可以不走,且他们的总个数最多只有15个。 the sum of energy pools and power switches is less than 15. 因此

虽然冲动永远比坚持容易~ 1300

BFS DFS算法,和动态规划

http://blog.youkuaiyun.com/u011437229/article/details/53188837 BFP是加障碍走地图的常用方法 动态规划则跟递归差不多,只不过是自上而下的递归,题目一般是在某种限制的条件下,遍历找到最值,而这种遍历如果利用递归思路看的话,就是解决一小部分的问题,就可以利用这一部分问题的数据解决更大一部分问题。 举例:合唱团问题

非常大非常大 2116

记忆化搜索 Memorization Search

记忆化搜索 Memorization Search什么是记忆化搜索记忆化搜索函数的三个特点记忆化搜索 vs 动态规划三种适用于DP的场景三种不适用于DP的场景Examples:Leetcode 140: 单词拆分 IILeetcode 44: 通配符匹配 什么是记忆化搜索 在递归函数中, 在函数返回前,记录函数的返回结果。在下一次以同样参数访问函数时直接返回记录下的结果 也就是对递归树进行剪枝,遇到已经计算过的节点就不再继续往下计算,直接返回储存在hash table中的值 记忆化搜索函数的三个特点

HelloWorld 2224

dfs /bfs/ dp/ 贪心 (leetcode55)

详见https://leetcode.com/articles/jump-game/# 思路 dfs/bfs dfs和bfs都是非常简单的思路。 在dfs中,可以通过最后一层的结果赋予上一层值,从而降低复杂度。 dp 这里我的思路是:i指针从后往前遍历。如果i指向的是一个好的点,那么将所有能一次到达i的点都赋值为好的点。 答案的思路是:依旧是i指针从后往前遍历。如果在i之后有i能到达的好的点,则i...

weixin_44147606的博客 1316

DFS+剪枝、DP(完全背包)、BFS:零钱兑换

LeetCode 322. 零钱兑换 这道题是综合性特别强的一个问题,在初次写的时候没多想,立马就暴力DFS,之后加了剪枝改进,才通过; 之后看了AcWing的背包视频,发现可以套用完全背包的思路; 然后来了兴趣,认真看了下评论区和题解区,发现能够使用BFS的思路,真是妙啊!遂记录一下。 一、DFS+剪枝 看到题,感觉和之前的子集、全排列、电话号码的字母组合等题目相近,二话不说直接开写。 int coinChange(vector<int>& coins, int amou

To the beyond and infinity! 820

BFS 、DFS区别,详解

BFS 、DFS区别,详解写在最前的三点: 1、所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次。 2、实现bfs和dfs都需要解决的一个问题就是如何存储图。一般有两种方法:邻接矩阵和邻接表。这里为简单起 见,均采用邻接矩阵存储,说白了也就是二维数组。 3、本文章的小测试部分的测试实例是下图: 一、深度优先搜索遍历 1、从顶点v出发深度遍历图G的算法 ① 访问v ② 依次

BackToMe的博客 5万+

记忆化搜索—— FatMouse and Cheese

FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid lo...

naiue的博客 252

算法基础代码(枚举、模拟、递归、二分、贪心、DP、BFS、DFS)

整理知识:模拟、二分、贪心、DP、DFS、BFS

阿正的梦工坊 1587
上一篇: fzu 2093 寻找兔子(状压dp)
下一篇: fzu 1894 志愿者选拔(单调队列)
LTSC
博客等级 码龄11年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值