首页 > 试题广场 >

附加题

[编程题]附加题
  • 热度指数:29675 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
存在n+1个房间,每个房间依次为房间1 2 3...i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:
    A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;
    B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;
现在路人甲想知道移动到房间n+1一共需要多少次移动;

输入描述:
第一行包括一个数字n(30%数据1<=n<=100,100%数据 1<=n<=1000),表示房间的数量,接下来一行存在n个数字 pi(1<=pi<=i), pi表示从房间i可以传送到房间pi。


输出描述:
输出一行数字,表示最终移动的次数,最终结果需要对1000000007 (10e9 + 7) 取模。
示例1

输入

2
1 2

输出

4

说明

开始从房间1 只访问一次所以只能跳到p1即 房间1, 之后采用策略A跳到房间2,房间2这时访问了一次因此采用策略B跳到房间2,之后采用策略A跳到房间3,因此到达房间3需要 4 步操作。
头像 卡题魔法少年
发表于 2020-08-15 14:37:18
从题目中,我们发现1<=pi<=i,说明我们只会被传送到当前房间之前的房间(包括当前房间)。所以当我们到i房间时,我们已经走过所有从第一个房间到第i-1个房间且均为偶数次。我们定义dp[i]表示从第一个房间达到第i个房间且为偶数次的移动次数。状态转移方程为dp[i] = dp[i-1] 展开全文
头像 Louie.Ye
发表于 2021-03-20 16:46:12
1. 题目意思[写博客为了记录一下这道题我很困扰] 1.老实说,题目意思我都没读懂。。。按照例子走,刚开始的1算访问次数,但不算移动次数的。对于移动的思路我是一点没理清楚。。还想多了会不会有pi到不了后面的情况。。肯定不会啊,题目都没说到不了输出情况测试数据肯定不会那么邪门。2. 观摩大佬的思路皮皮 展开全文
头像 牛客678001545号
发表于 2022-04-08 12:59:28
题目关键点:传送房间pi(1<=pi<=i),也就是说明只能原地传送或者向前传送。 于是可以得出:从房间i到达房间i+1时,房间i被访问了偶数次(即可认为被访问了0次)。同理可知,房间i+1之前的所有房间都可被视为没有被访问。 令 to_room[i] 表示房间i传送到的房间,ste 展开全文
头像 牛客386231296号
发表于 2021-08-10 16:06:22
动态规划解题思路 由于pi<=i,所以要前往n+1个房间只能通过策略1:即访问n房间偶数次向前一步,因此前往n+1房间的问题就可以看成前往n房间,就可以用动规思路去求解memo[i]表示前往房间号为i+1的房间需要的次数,memo[0]=0,memo[1]=2 递推公式如下:memo[i]= 展开全文
头像 朽月
发表于 2021-10-08 14:05:20
/** * { 0 i=1 * dp[i] = { dp[i-1]+2 i>1,pi[i-1]=i-1 * { dp[i-1]+(dp[ 展开全文
头像 G了的灰太狼很想找对象
发表于 2022-10-07 15:50:35
思路 dp状态定义为第一次抵达i号房间时已经产生的移动次数,即dp[]数组中存储的数据的含义 注意关注到两点: 第一点:当移动到i号房间时,意味着前方所有的房间的访问次数均为偶数次,否则不会到达i号房间 第二点:从i-1号房间跳到前方的pi号房间后,再次移动到 展开全文
头像 olddog#23
发表于 2022-10-25 22:09:16
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyn 展开全文
头像 应笑
发表于 2021-09-15 15:36:28
#include<stdio.h> #include<vector> using namespace std; const int mod = 1000000007; int main(){ int n, i; scanf("%d", &a 展开全文
头像 MrZ_001
发表于 2021-10-29 22:59:34
这种题目首先肯定是找模型 我先想到的肯定是如果 pi 都为 1 ,要怎么处理 然后发现这个简单了 如果到底n个房间的次数为 P(n); P(n + 1) = 2 * P(n) + 2 ;//因为回到1 肯定就是重走一遍 1 到 n 的路程 所以肯定是2倍了 然后有 额外走了 回 1 和到 n 展开全文
头像 Bamboo2022
发表于 2022-05-02 20:52:36
动态规划题 递推公式比较重要 到达第i间房间 需要 偶数次 到达 第 i - 1次房 然后有传送门机制节省步数 所以需要 减去 dp[room[i - 1]] 的步数 最后得到 dp[i] = (dp[i - 1] + 1 + dp[i - 1] - dp[room[i - 1]] + 1) % m 展开全文