(defconstant +inf+ 987654321987654321) (defun main (&rest argv) (declare (ignorable argv)) (let* ((*read-default-float-format* 'double-float) (n (read)) (p (read)) (h (make-array n :element-type 'integer)) (dp1 (make-array n :element-type 'integer :initial-element +inf+)) (dp2 (make-array n :element-type 'integer :initial-element +inf+))) (dotimes (i n) (setf (aref h i) (read))) (setf (aref dp1 0) 0) (loop for i from 1 below n do (setf (aref dp1 i) (min (+ p (aref dp2 (1- i))) (+ (aref dp1 (1- i)) (min (max (- (aref h i) (aref h (1- i))) 0) p))) (aref dp2 i) (min (+ p (aref dp1 (1- i))) (+ (aref dp2 (1- i)) (min (max (- (aref h (1- i)) (aref h i)) 0) p))))) (format t "~d~%" (min (aref dp1 (1- n)) (aref dp2 (1- n)))))) (main)