好玩的题。

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

假设我们第一次走到了一个点$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. 【经典】Noip贪心

    一.经典例题 例一:排队接水 题意:n个人到r个水龙头接水,装满水桶的时间分别是t1,t2,t3.... 接水时间是整数且互不相等,怎样安排顺序使每个人等待的 时间和最小. 题解:排队越靠前计算次数越 ...

  2. 阿里云接口异常-Can not find endpoint to access

    最近在做公司的资产盘点,需要请求阿里云的接口获取公司的云服务器信息.在获取实例列表的过程中,通过异常机制捕获了 Can not find endpoint to access 这个错误.经过多次排查, ...

  3. Collections排序

    0.前言 ThreeSet的底层实现是红黑树,它在创建set的过程中实现排序.Collections.sort是在对整个集合进行排序,按道理来说使用TreeSet插入集合元素直至建立整个TreeSet ...

  4. git超速掌握之一(基本使用)

    前言: 无论你是运维.开发还是IT爱好者,都会听说github了吧?动不动哪位大神就说在github上有什么什么项目,我的github地址是xxxxx,甚至有自己个github在找新工作时都能给自己加 ...

  5. lnmp php7 安装mysqli扩展 undefined function mysqli_connect()

    在用ci框架的时候, https://blog.csdn.net/zqtsx/article/details/8746497 https://blog.csdn.net/move_now/articl ...

  6. Py修行路 python基础 (七)文件操作 笔记(随时更改添加)

    文件操作流程: 1.打开文件 open() 2.操作文件 read .writeread(n) n对应读指定个数的 2.x中读取的是字节! 3.x中读取的是字符!read 往外读取文件,是以光标位置开 ...

  7. ILMerge最佳实践

    背景 为了生成的代码更加简捷,复制方便,常常会把多个可执行文件合并成一个. 方案 Project=>Properties=>Build Events=>Edit Post-build ...

  8. python's thirty-first day for me re模块

    正则表达式: re 模块 可以读懂 你写的正则表达式,根据你写的表达式去执行任务. 正则表达式:字符串的操作. 使用一些规则来检测字符串是否符合我的要求  ——  表单验证 从一段字符串中找到符合我要 ...

  9. 第一次调用Web service响应速度慢的解决办法

    Env: Client: WinForm(Net Framework 2.0) Server:Web Service(Net Framework 4.0) Problem: Client use pr ...

  10. RabbitMQ操作方法

    /// <summary> /// 消费者(消息) /// </summary> public class CustmerMq { /// <summary> // ...