给$m$个安全点, 从$0$走到$n$,$g$秒绿灯$r$秒红灯循环,绿灯可以走,在安全点可以转向,绿灯必须移动,红灯必须呆在安全点。问最少时间达到$n$需要的的时间。
$dp[i][j]$表示到达$i$这个点耗时$dp[i][j]\times (g+r)+j$秒。
最后是找到达$n$的各种$dp[][j]$的最小值。
考虑$BFS$去找(类似最短路),假设当前在$x$点,
- 若$j+a[x+1]-a[x],j+a[x]-a[x-1]<g$则表示可以走,并且转移$dp$权值不会增加。
- 若$j+a[x+1]-a[x],j+a[x]-a[x-1]=g$则表示可以走,但一轮就结束了。转移$dp$权值会增加。
- 进行转移可以进行类似最短路的放缩变换。
类似与$01BFS$,边权有01,双端队列优化即可,否则$TLE \ on \ 80$。
代码
1 |
|