区间和DP、
区间和DP
你需要访问 n
个房间,房间从 0
到 n - 1
编号。同时,每一天都有一个日期编号,从 0
开始,依天数递增。你每天都会访问一个房间。
最开始的第 0
天,你访问 0
号房间。给你一个长度为 n
且 下标从 0 开始 的数组 nextVisit
。在接下来的几天中,你访问房间的 次序 将根据下面的 规则 决定:
- 假设某一天,你访问
i
号房间。 - 如果算上本次访问,访问
i
号房间的次数为 奇数 ,那么 第二天 需要访问nextVisit[i]
所指定的房间,其中0 <= nextVisit[i] <= i
。 - 如果算上本次访问,访问
i
号房间的次数为 偶数 ,那么 第二天 需要访问(i + 1) mod n
号房间。
请返回你访问完所有房间的第一天的日期编号。题目数据保证总是存在这样的一天。由于答案可能很大,返回对 109 + 7
取余后的结果。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
提示:
n == nextVisit.length
2 <= n <= 105
0 <= nextVisit[i] <= i
如果没有注意到0 <= nextVisit[i] <= i
,那么本题只能往图论的方向去思考,完全没有思路。但正是题目给出了这个条件,大概率就是动态规划了。令f[i]
表示第一次访问i
号房间的天数,g[i]
表示偶数次访问房间i
的天数,由于0 <= nextVisit[i] <= i
,显然f[i] = g[i - 1] + 1(i > 0)
,如何来求g[i]
,其实我们并不需要模拟整个过程因为所有从i -> j
的路都是一样的(在i
的访问的奇偶相同时),只需要求出其中的差值即可。从下图可以看出g[i] = f[i] + g[i - 1] - f[k] + 2
1 |
|
区间和DP、
http://example.com/2024/03/28/区间和DP/