好玩的题。

首先我们(看一下题解之后)发现当你第一次走到了一个点的时候,那么它之前的所有点一定都访问过了偶数次。

假设我们第一次走到了一个点$i$,那么$i - 1$一定访问了偶数次,那么第一次走$i - 1$的时候会走到$p_{i - 1}$,也就是说不断重复这个走偶数次的过程最终到达了$i$。

因为题目保证了$p_i \leq i$,所以我们可以$dp$了,设$f_{i, j}$表示从$i$走到$j$需要的步数。

边界:$f_{i, i} = 1$。注意这里是从$i$走到$i$,而不是停在原地不动了。

有方程:$f_{i, j} = f_{i, j - 1} + f_{p_{j - 1}, j - 1} + 1$。

解释一下:要从$i$走到$j$,需要先走到$j - 1$,然后从$p_{j - 1}$走回到$j - 1$,再走一步走到$j$。

最后答案是$f_{1, n + 1} - 1$,因为一开始就在$1$。

然而转移顺序似乎并不明显,记忆化搜索实现。

时间复杂度$O(n^2)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = ;
const int P = 1e9 + ; int n, nxt[N], f[N][N]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void inc(int &x, int y) {
x += y;
if(x >= P) x -= P;
} inline void sub(int &x, int y) {
x -= y;
if(x < ) x += P;
} int dfs(int i, int j) {
if(i == j) return f[i][j] = ;
if(f[i][j]) return f[i][j];
int res = ;
inc(res, dfs(i, j - ));
inc(res, dfs(nxt[j - ], j - ));
inc(res, );
return f[i][j] = res;
} int main() {
read(n);
for(int i = ; i <= n; i++) read(nxt[i]);
int ans = dfs(, n + );
sub(ans, );
printf("%d\n", ans);
return ;
}

CF407B Long Path的更多相关文章

  1. NOIP前刷题记录

    因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...

  2. NOIP刷题

    搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...

  3. CF 407B Long Path[观察性质 DP]

    B. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  4. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  5. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  6. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  7. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  8. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  9. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

随机推荐

  1. VS 2015 开发Android底部导航条----[实例代码,多图]

      1.废话背景介绍  在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual ...

  2. 学习动态性能表(5)--v$session

    学习动态性能表 第五篇--V$SESSION  2007.5.29 在本视图中,每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,LGWR,arcch ...

  3. Terracotta设计原理分析--(部分内容来自官方描述)

    因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...

  4. Nginx安装过程

    1. 首先 ./configure --prefix=/usr/common/nginx --with-http_stub_status_module 报如下错误: 2. 从报的错可以看出缺少pcre ...

  5. SCSI, (P)ATA, SAS, NL-SAS and SATA, what’s the difference?

    Everybody needs storage space nowadays. Whether it is used for high performance computing or simply ...

  6. Annotation之一:Java Annotation基本功能介绍

    一.元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: 编写文档:通过代码里标识的元数据生成文档.这是最常见的,也是java 最早提供的 ...

  7. Pycharm快速复制当前行到下一行Ctrl+D

    Pycharm快速复制当前行到下一行Ctrl+D

  8. xunsearch搜索使用

    目录 如何开始搜索? 典型处理 快捷操作 搜索中的串接操作 构建搜索语句 如何开始搜索? <?php // 引入 require_once './sdk/xs/lib/XS.php'; // 创 ...

  9. 七 Kafka Streams VS Consumer API

    1 kafka Streams:   概念: 处理和分析储存在Kafka中的数据,并把处理结果写回Kafka或发送到外部系统的最终输出点,它建立在一些很重要的概念上,比如事件时间和消息时间的准确区分, ...

  10. python中常用模块详解二

    log模块的讲解 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口API: handler将(logger创建的 ...