【基础算法训练】—— 深度优先搜索

💓前言

在这里插入图片描述
每日算法练习,千锤百炼,静待花开。

Leetcode的专栏会持续更,因为在跟着英雄哥做知识星球的事儿:在lc被欺负的这些年
对英雄哥的知识星球有兴趣的可以看看他这篇文章喔: 英雄算法联盟 | 31天让你的算法与众不同
但是英雄哥这儿了,五月不再招人啦,有想法的小伙伴浅等六月嗷~
单片机是会持续更的,但是硬件看到人比较少吧,或者我理解它不投策,这个更得慢:十四天学会51单片机

至于现在这个专栏只会记录全部是每日的算法题:知识星球每天的习题,以及在咱高校算法学习社区中,泡泡和p佬普及组和提高组的题目,一般是当天写当天更吧。现在优先写泡泡的题,p佬的有点小把握不住

在这里插入图片描述
好朋友执梗正在带新星计划,有想法的小伙伴不要犹豫嗷
点击查看详情
在这里插入图片描述

在这里插入图片描述

💓第一题 P3353 在你窗外闪耀的星星

💒题目描述

在这里插入图片描述
原题传送门

🌟解题报告

浅吐槽一下,这个题目背景也太长了吧,但是很浪漫诶
在这里插入图片描述

看到求区间和,我就想拿出我熟悉的前缀和了。看到有佬佬们用线段树,但是暂时不退,RBQ
前缀和的使用主要是
前缀和数组sum的预处理
sum[区间右端点] - sum[区间左端点 - 1]来实现O(1)的区间和查询
这个题了,因为题目说的是每颗星星都有自己的位置,并没有说每个位置只能有一颗星星,一个位置是可以允许有多枚星星的,倘若是按照每个位置只有一颗星星的想法处理了,只有10分~

统计窗口能够看到的最亮的星星的亮度了,小类似滑动窗口。窗口的长度是w。为了把窗口滑动的过程+前缀和区间求和的公式结合在一起,枚举的时候,可以将窗口长度作为初始值,这种既可以统计窗口长度内的区间和,也不会出现数组角标越界。

🌻参考代码(C++版本)

#include <bits/stdc++.h> 

using namespace std;
typedef long long LL;
const int N = 100000+10;
int sum[N],cnt[N];

int main()
{
   
	//前缀和
	//输入星星的数量和窗户的宽度
	int n , w,pos = 0;
	cin >> n >>w;

	for(int i = 1; i <= n;i++)
	{
   
		int a,b;
		//输入坐标和亮度
		cin >> a >> b;
		cnt[a] += b;//可能说,同一个坐标,是有多个不同亮度的星星,因此比平常的前缀和多一步预处理
		//统计星星的坐标,找到最远的坐标
		pos = max(pos,a);
	}

	//预处理前缀和	
	for(int i = 1; i <= pos;i++)
		sum[i] = sum[i-1] + cnt[i];
	
	int ans = -1;
	//按照窗户宽度扫一遍,找最大值
	for(int i = w; i <= pos;i++)
		ans = max(sum[i]-sum[i-w],ans);

	cout << ans;

	return 0;
}

在这里插入图片描述

💓 搜索的知识铺垫

💒搜索的原理

直接薅英雄哥文章里的图,不反复造轮子了 ,谢谢英雄哥🌹 🌹 🌹
在这里插入图片描述

🌟深度优先搜索

在这里插入图片描述
常规玩法:
① 递归统计结果,比如求阶乘
② 递归求指数型枚举,比如求斐波那契数列的第n项
③ 递归求排列型枚举,比如求n个数字的全排列

进阶应用领域: 枚举、容斥原理、基于状态压缩的动态规划、记忆化搜索、有向图强连通分量、无向图割边割点和双连通分量、LCA最近公共祖先、博弈、二分图、欧拉回路、K短路、线段树、最大团、最大流、树形DP。
上面的内容有个印象就好,具体想掌握,还得落实到题目上,感觉英雄哥写的记忆化搜和剪枝的内容让我受益匪浅,着重记录一下。以及捋清楚了回溯是怎么回溯的,浅偷下一了 在这里插入图片描述

基于DFS的记忆化搜索
<
  • 44
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值