【笔记】「pj复习」深搜——拿部分分
说在最前面
众所周知, NOIP pj 的第三题大部分都是 dp ,但是有可能在考场上想不到动态转移方程,所以我们就可以拿深搜骗分。
方法
- 深搜拿部分分
- 剪枝
- 记忆化
- 看数据范围
有时候发现,写完深搜,发现可以打表qwq!
那不就很香嘛(
实践出真知
例一:P1057 传球游戏
法1
dfs 暴搜
期望得分:\(\rm 40pts\)
首先写出 \(dfs\) 的参数:
首先是小蛮在第几号,当然是 \(1\) ,然后是次数 \(0\)
再看递归边界
这里是环状递归边界:
if (x == 0) x = n;
if (x == n + 1) x = 1;
if (step == m) {
if (x == 1) return 1;
return 0;
}
接下来往下继续搜。
dfs(x + 1, step + 1) + dfs(x - 1, step + 1);
好! \(\rm 40pts\) 到手!
那么我们可以再看一下数据范围,那么小!直接打表啊!
因为时间关系,这里打表就不多讲解了。
法2
加上记忆化
期望得分:\(\rm 90pts\)
大家应该都知道:暴搜加上记忆化 \(≈\) 动归
所以我们加上记忆化:
定义一个 \(a\) 数组,表示在某一个位置经过 \(step\) 步能否回到起始位置的方法数。
if (a[x][step] != 0) return a[x][step];
放上 dfs 代码:
int dfs (int x, int step) {
if (x == 0) x = n;
if (x == n + 1) x = 1;
if (step == m) {
if (x == 1) return 1;
return 0;
}
return dfs(x + 1, step + 1) + dfs(x - 1, step + 1);
}
为什么是 90 分???
因为想一下,如果是奇数,那么永远传不到小蛮手中,就会肯定 T 。

法3
加一个特判。
期望得分: \(100pts\)
if (n % 2 == 0 && m % 2 == 1) {
cout << 0;
return 0;
}
法4
既然这题的正解是 dp,那么我们还是要讲讲 dp 的。
其实 dp 和记忆化没有很大的区别。
状态表示:\(\rm f[i][j]\) 表示第 \(i\) 次传球后球在第 \(j\) 个小朋友手上回到小蛮手中的方案数。
我们发现 \(\rm f[i][j]\) 跟 \(\rm a[x][step]\) 是很像的。
状态转移:\(\rm f[i][j] =
\begin{cases}
\rm f[i - 1][j - 1] & \text{第 i 次传球从左边传给 j}\\
\rm f[i - 1][j + 1] & \text{第 i 次传球从右边传给 j}
\end{cases}\)
这样写对不对?不对!
因为这是环状的,环状的解决方法通常是 \(\mod n\)
\((x + n - 1) \mod n + 1\)
所以正确状态转移为:\(\rm f[i][j] =
\begin{cases}
\rm f[i - 1][(j - 1 + n - 1) \mod n + 1] & \text{第 i 次传球从左边传给 j}\\
\rm f[i - 1][(j + 1 + n - 1) \mod n + 1] & \text{第 i 次传球从右边传给 j}
\end{cases}\)
所以:\(\rm f[i][j] = f[i - 1][(j - 1 + n - 1) \mod n + 1] + f[i - 1][(j + 1 + n - 1) \mod n + 1]\)
做完,最后放上 AC 代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#define line cout << endl
using namespace std;
int f[35][35];
int n, m;
int main() {
cin >> n >> m;
f[1][n] = f[1][2] = 1;
for (int i = 2; i <= m; i++) {
for (int j = 1; j <= n; j++) {
f[i][j] = f[i - 1][(j - 1 + n - 1) % n + 1] + f[i - 1][(j + 1 + n - 1) % n + 1];
}
}
cout << f[m][1] << endl;
return 0;
}
【笔记】「pj复习」深搜——拿部分分的更多相关文章
- 【笔记】「pj复习」深搜——简单剪枝
深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...
- 「PKUWC 2018」随机算法 (60分部分分做法)
明天就是CTSC的DAY 2了qwq,晚上敲敲暴力攒攒RP,果断随便看了个题就是打暴力hhhhh 前50% O(3^N) 暴力没什么好说的,我们设F[S][s]为已经选了S集合中的点,并且这个集合中的 ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...
- 「一入 Java 深似海 」系列课程
第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- Note -「Lagrange 插值」学习笔记
目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...
- Note -「动态 DP」学习笔记
目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「S ...
- Note -「单位根反演」学习笔记
\(\mathcal{Preface}\) 单位根反演,顾名思义就是用单位根变换一类式子的形式.有关单位根的基本概念可见我的这篇博客. \(\mathcal{Formula}\) 单位根反演的 ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
随机推荐
- Java 实例化接口或抽象类
1. 实例化接口: 某一天,我们想通过反射调用一个类的方法,但发现方法参数中有一个接口,我们都知道接口不能被实例化,这该怎么办呢? 举例: public class TestLib { public ...
- 建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
环境配置 项目环境: JDK1.8 tomcat7 maven3.5 开发工具: IDEA activiti7 创建项目 目标:创建一个maven项目,集成Activiti,并自动生成25张数据库表 ...
- Linux(CentOS6.8)配置Docker
Centos6.8 1.查看自己的内核 [1].uname [root@host79 ~]# uname -r 2.6.32-642.el6.x86_64 [2].查看CentOS版本信息 CentO ...
- 我要进大厂之大数据MapReduce知识点(2)
01 我们一起学大数据 今天老刘分享的是MapReduce知识点的第二部分,在第一部分中基本把MapReduce的工作流程讲述清楚了,现在就是对MapReduce零零散散的知识点进行总结,这次的内容大 ...
- Weevely使用方法以及通信流量分析
Weevely简介 weevely项目地址:点击查看 weevely是一款针对PHP的webshell的自由软件,可用于模拟一个类似于telnet的连接shell,weevely通常用于web程序的漏 ...
- 被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?
一:背景 1. 讲故事 前几天公号里有一位朋友留言说,你windbg玩的溜,能帮我分析下被 ThreadStatic 修饰的变量到底存放在哪里吗?能不能帮我挖出来,其实这个问题问的挺深的,玩高级语言的 ...
- C++中class和struct区别
1.存储不同 结构体使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation). 栈的空间相对较小.但是存储在栈中的数据访问效率相对较高. 堆的空间相对较大.但是 ...
- 对于线程池ThreadPool的学习总结
线程池:就是一个管理线程的池子. 优点: 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗.因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是 ...
- CorelDRAW“出血线”的精准预设与辅助线便捷操作
CorelDRAW软件是一款常用的制图工具,非常适合用于印刷品输出,各种印刷图文制作都依赖于它.所以,我们设计者每次用CorelDRAW制图的一个关键就是要做好"标尺辅助线"设置, ...
- Maven更换阿里源与仓库地址
一.为什么要更换maven中的阿里源和仓库地址? 因为咱们下载安装的maven默认配置的源的服务器在国外,所以对于咱们来说,下载jar包的速度会很慢,所以咱们要把它替换为咱们国内的,可以换成好多,如华 ...