青蛙跳石头
- 难度 入门
- 时限 1s
- 空限 256m
- 线性DP
数据规模:,。
思路
状态设计:设 表示从第 块石头跳到第 块石头所需的最少体力,。
转移:最后一步只能从第 块或第 块跳来,因此
边界为 、,答案为 。由于每次转移只依赖前两个状态,用两个滚动变量维护 与 即可,无需开数组。
以样例 验证:,对应路线 ,消耗 。
复杂度
时间 ,额外空间 。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
import std.math.*
main() {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let h = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
var prev2: Int64 = 0
var prev1: Int64 = abs(h[1] - h[0])
var i: Int64 = 2
while (i < n) {
let c1 = prev1 + abs(h[i] - h[i - 1])
let c2 = prev2 + abs(h[i] - h[i - 2])
if (c1 < c2) {
prev2 = prev1
prev1 = c1
} else {
prev2 = prev1
prev1 = c2
}
i += 1
}
println(prev1)
}