题目详见https://leetcode.cn/problems/first-day-where-you-have-been-in-all-the-rooms/
t
o
=
n
e
x
t
v
i
s
i
t
[
i
]
:
第一次到
i
之后回退到的位置
to=nextvisit[i]: 第一次到i之后回退到的位置
to=nextvisit[i]:第一次到i之后回退到的位置
f
[
i
]
:
从奇数次到
i
到奇数次到
i
+
1
所需要的天数
f[i]: 从奇数次到 i 到奇数次到i+1所需要的天数
f[i]:从奇数次到i到奇数次到i+1所需要的天数
d
p
[
i
]
:
从
0
号房间出发到
i
+
1
号房间所需要的天数
dp[i]: 从0号房间出发到i+1号房间所需要的天数
dp[i]:从0号房间出发到i+1号房间所需要的天数
首次到第i+1个房间 d p [ i ] dp[i] dp[i]分4步:
- (奇数次到 i i i)从起点走到 i i i; T = d p [ i − 1 ] T=dp[i-1] T=dp[i−1]
- 从 i i i跳到 n e x t V i s i t [ i ] nextVisit[i] nextVisit[i]; T = 1 T=1 T=1
- 从 n e x t V i s i t [ i − 1 ] nextVisit[i-1] nextVisit[i−1]再走到 i i i; T = d p [ i − 1 ] − d p [ n e x t v i s i t [ i − 1 ] ] T=dp[i-1]-dp[nextvisit[i-1]] T=dp[i−1]−dp[nextvisit[i−1]]
- (偶数次到 i i i)从 i i i走到 i + 1 i+1 i+1; T = 1 T=1 T=1
综上
d
p
[
i
]
=
d
p
[
i
−
1
]
+
1
+
d
p
[
i
−
1
]
−
d
p
[
n
e
x
t
v
i
s
i
t
[
i
−
1
]
]
+
1
dp[i]=dp[i-1] + 1 + dp[i-1]-dp[nextvisit[i-1]] + 1
dp[i]=dp[i−1]+1+dp[i−1]−dp[nextvisit[i−1]]+1
对你没看错是题解错了
注释代码
class Solution {
public:
int firstDayBeenInAllRooms(vector<int>& nextVisit) {
int mod = 1e9 + 7;
int len = nextVisit.size();
vector<int> dp(len);
dp[0] = 2; //初始化原地待一天 + 访问下一个房间一天(第二步的时间)
for (int i = 1; i < len; i++) {
int to = nextVisit[i];
dp[i] = 2 + dp[i - 1]; //1,2,4步
if (to != 0) {
// 这里是第三步的第一部分,我做的时候主要这里这个dp[to - 1]比较难理解
// dp[to] 代表的是从0到to+1,所以想到to的话就是dp[to - 1]
dp[i] = (dp[i] - dp[to - 1] + mod) % mod; //避免负数
}
dp[i] = (dp[i] + dp[i - 1]) % mod; // 这里是第三步的第二部分
}
return dp[len - 2]; //输出dp[n-2], 也就是到n-1的距离,而此时恰好下标从0开始。
}
};
笔者也在新手学习期中,所写的内容主要与大家交流学习使用,如有发现任何问题敬请指正!