```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
var h int64
fmt.Fscan(reader, &n, &h)
x := make([]int64, n)
for i := 0; i < n; i++ {
fmt.Fscan(reader, &x[i])
}
if h == 0 {
fmt.Println(0)
return
}
M := make([][]int64, n)
for i := 0; i < n; i++ {
M[i] = make([]int64, n)
}
for length := 2; length <= n; length++ {
for i := 0; i <= n-length; i++ {
j := i + length - 1
dist := x[j] - x[i]
req := (dist + 1) / 2
Z := int64(0)
if h >= req {
Z = h - req
}
maxM := int64(-1)
for k := i; k < j; k++ {
val := M[i][k] + M[k+1][j]
if val > maxM {
maxM = val
}
}
M[i][j] = Z + maxM
}
}
dp := make([]int64, n+1)
dp[0] = 0
for i := 1; i <= n; i++ {
dp[i] = -1
for j := 0; j < i; j++ {
dist := x[i-1] - x[j]
req := (dist + 1) / 2
if req <= h {
cost := h*int64(i-j) - M[j][i-1]
if dp[i] == -1 || dp[j]+cost < dp[i] {
dp[i] = dp[j] + cost
}
}
}
}
fmt.Println(dp[n])
}
```