说在最前面

众所周知, NOIP pj 的第三题大部分都是 dp ,但是有可能在考场上想不到动态转移方程,所以我们就可以拿深搜骗分。

方法

  1. 深搜拿部分分

    • 剪枝
    • 记忆化
  2. 看数据范围

有时候发现,写完深搜,发现可以打表qwq!

那不就很香嘛(

实践出真知

例一:P1057 传球游戏

\(\Large\rm Link\)

法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复习」深搜——拿部分分的更多相关文章

  1. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  2. 「PKUWC 2018」随机算法 (60分部分分做法)

    明天就是CTSC的DAY 2了qwq,晚上敲敲暴力攒攒RP,果断随便看了个题就是打暴力hhhhh 前50% O(3^N) 暴力没什么好说的,我们设F[S][s]为已经选了S集合中的点,并且这个集合中的 ...

  3. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  4. 「一入 Java 深似海 」系列课程

    第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. Note -「Lagrange 插值」学习笔记

    目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...

  7. Note -「动态 DP」学习笔记

    目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「S ...

  8. Note -「单位根反演」学习笔记

    \(\mathcal{Preface}\)   单位根反演,顾名思义就是用单位根变换一类式子的形式.有关单位根的基本概念可见我的这篇博客. \(\mathcal{Formula}\)   单位根反演的 ...

  9. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

随机推荐

  1. 定制ubuntu的时候修改proseed

    一个参数的修改 d-i clock-setup/utc-auto boolean false (不用utc) d-i clock-setup/ntp boolean false (不时间同步) d-i ...

  2. Spring MVC——项目的开发流程

    创建项目(IDEA下) 打开IDEA,我们开始创建一个简单的Spring MVC项目,流程如下: 这里要注意一下,我们是基于Maven开发项目,当然是要配置Maven环境的,如果大家之前从来没有配置过 ...

  3. CVE-2020-3452 CISCO ASA远程任意文件读取漏洞

    0x01 漏洞描述     Cisco官方 发布了 Cisco ASA 软件和 FTD 软件的 Web 接口存在目录遍历导致任意文件读取 的风险通告,该漏洞编号为 CVE-2020-3452.     ...

  4. python-网络安全编程第四天(数据库编程&网络编程)

    前言 好几天没更因为寒假放假回家放松了几天 嘿嘿 今天继续开始启动学习模式. python数据库编程 Python DB API访问数据库流程 Python DB API包含的内容 什么是 PyMyS ...

  5. 匹配p后面不是h的单词

    $string = 'python perl pear php'; // 获取p后面不是h的单词 $preg = '/\bp(?!h)[a-z]+\b/'; $status = preg_match_ ...

  6. 公司人员组织架构图用思维导图软件MindManager怎么做

    有朋友一直不太明白组织架构图怎么做,其实组织架构图就是组织结构图.小编今天就在这里以一个公司为例,来给大家演示一番人员组织结构图怎么做. 老规矩,先说一下小编使用的软件跟电脑系统,这里用的是MindM ...

  7. 攻克弹唱第八课(吉他演奏的律动与funk音乐)

    在本期文章中,笔者将为通过Guitar Pro 7吉他打谱软件与大家分享一下吉他律动与funk音乐的经验. 想必正在看这篇文章的进阶者和高手,都会考虑这样一个问题.我辛辛苦苦练习的大段solo和指弹曲 ...

  8. 简单实用的Boom 3D基础入门教程分享

    Boom 3D可以很大限度的弥补声音设备或是环境的不足,满足您更加高级的声学体验.Boom 3D用简单明了的方式帮助您设计声音,即使您不是专业的声音编辑,也可以达到专业相似的效果. 打开Boom 3D ...

  9. angular11源码探索[DoCheck 生命周期和onChanges区别]

    网站 https://blog.thoughtram.io/ https://juristr.com/ https://www.concretepage.com/angular/ https://ww ...

  10. java44

    1.使用封装工具类思想:三种输入模式下的工具类. dateUtils类, StringUtils类(判断字符串值是否为空), 调用工具类: String res = dateUtils.datetoS ...