题目大意:
有n+1个房间。从1-n个房间。每个房间有两扇门。一扇去i+1的房间另一扇去编号为pi的房间。问到达n+1的房间至少要走多少次。
如果走过的次数是奇数次:就走pi这个门
如果走过的次数是偶数次:就走i+1这个门
(初始值1的位置是奇数)
dp[i] 表示1到i这个位置需要走多少次门
思路:
因为 1 <= pi <= i,所以如果你可以向 i+1这个门走过去,则1-i这些门必定全是走过偶数次,当i位置为奇数次时,pi -> i-1这些位置也同样会被重新在走过一次(即所走过的门的数量也同样会再次计算一次)
回到原先pi的位置,应为pi继续向p[pi]位置靠近,所以会回到最开始的位置1(也不一定是1),重新计算,从1->pi这个位置需要走多少次门(因为前面已经计算可以dp[pi]的值,我们可以直接拿来用就可以了)
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; const int mod = 1e9 + 7; int dp[maxn], sum[maxn]; int p[maxn]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> p[i]; } dp[0] = 0; for (int i = 1; i <= n; i++) { dp[i] = (2 * dp[i - 1]%mod - dp[p[i] - 1] + 2 + mod) % mod; } cout << dp[n] << endl; return 0; }