Buggy python submission (verdict: Runtime Error):
# _*_ coding:utf-8 _*_
#  Atcoder_EducationDP_ContestX-1_other2
#  TODO https://atcoder.jp/contests/dp/tasks/dp_a
#  参考文献 https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E8%A7%A3%E6%B3%95
#  C++ バージョンを上から書き下す
#  TODO メモ化再帰
#  https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E5%88%A5%E8%A7%A3-2-%E3%83%A1%E3%83%A2%E5%8C%96%E5%86%8D%E5%B8%B0
import sys

# 初期化
# 足場の数となる要素数は足場の値の最大値であるMAX
blockMAXElement = 100010
blockElementRange = range(0,blockMAXElement,+1)
# DPテーブルの中身は今回は最小値を求めるため最大値を利用

dp = [sys.maxsize] * blockMAXElement
# コスト
# 参考文献のC++では配列は宣言時に初期化されるがpythonはそれがないのでまずはあえて0で初期化
h = [0] * blockMAXElement
# 入力データ諸々
N = int(input().strip())
inputh = list(map(int,input().strip().split(' ')))
# h配列を入力データから取り出した物に置き換える
for i  in range(0,len(inputh),+1):
	h[i] = inputh[i]

# 初期の条件 0歩の時だけはコストがないので、0にセット
dp[0] = 0

def rec(position):
	# まずは最大値にセット(上でもやっているのだが)
	answer = sys.maxsize
	if position == 0:
		answer = 0
	# もしメモを見てデフォルトでセットされた最大値以下であれば更新済みなのでその値をそのまま返す
	elif dp[position] < sys.maxsize:
		answer = dp[position]
	else:
		# 貰うDPを想定して組む
		# 一つ手前の足場から来た場合
		nowCost = rec(position-1)+abs(h[position]-h[position-1])
		if nowCost < answer:
			answer=nowCost
		# 二つ手前から来た場合→position = 1では-1を参照するので不具合
		if 2 <= position :
			nowCost = rec(position-2)+abs(h[position]-h[position-2])
			if nowCost < answer:
				answer=nowCost
	# この位置についての最小値はdp配列にメモする
	dp[position] = answer
	return answer

answer = rec(N-1)
print("{}".format(answer))

Fixed submission:
# _*_ coding:utf-8 _*_
#  Atcoder_EducationDP_ContestX-1
#  TODO https://atcoder.jp/contests/dp/tasks/dp_a
#  参考文献 https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E8%A7%A3%E6%B3%95
#  C++ バージョンを上から書き下す
#  貰う型DP
import sys

# 初期化
# 足場の数となる要素数は足場の値の最大値であるMAX
blockMAXElement = 100010
blockElementRange = range(0,blockMAXElement,+1)
# DPテーブルの中身は今回は最小値を求めるため最大値を利用
dp = list()
for _ in blockElementRange:
	dp.append(sys.maxsize)

N = int(input().strip())
blockRange = range(0,N,+1)
h = list(map(int,input().strip().split(' ')))

# 初期の条件 0歩の時は値が与えられていないのでDPは0にセット
dp[0] = 0
for position in range(1,N,+1):
#   一つ手前の足場までで最適な値のはず、のコスト
	previousMinCost = dp[position-1]
#   一つ手前から来た場合の足場positionでのコスト計
#   pM = previousMin
	pMNowCost = dp[position-1]+abs(h[position]-h[position-1])
#   今の足場で設定されている足場へのコストより小さくなるならそれを改めて入れる
	if pMNowCost <= dp[position]:
		dp[position] = pMNowCost
#   これは二つ手前から来たケースを考えるのでpositon = 1の場合を除いて考える
#   それ以降は一個手前からと同じ
	if 1 < position:
		previous2MinCost = dp[position-2]
		pM2NowCost = dp[position-2]+abs(h[position]-h[position-2])
		if pM2NowCost <= dp[position]:
			dp[position] = pM2NowCost

print("{}".format(dp[N-1]))

Buggy python submission (verdict: Runtime Error):
# _*_ coding:utf-8 _*_
#  Atcoder_EducationDP_ContestX-1_other2
#  TODO https://atcoder.jp/contests/dp/tasks/dp_a
#  参考文献 https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E8%A7%A3%E6%B3%95
#  C++ バージョンを上から書き下す
#  TODO メモ化再帰
#  https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E5%88%A5%E8%A7%A3-2-%E3%83%A1%E3%83%A2%E5%8C%96%E5%86%8D%E5%B8%B0
import sys

# 初期化
# 足場の数となる要素数は足場の値の最大値であるMAX
blockMAXElement = 100010
blockElementRange = range(0,blockMAXElement,+1)
# DPテーブルの中身は今回は最小値を求めるため最大値を利用

dp = [sys.maxsize] * blockMAXElement
# コスト
# 参考文献のC++では配列は宣言時に初期化されるがpythonはそれがないのでまずはあえて0で初期化
h = [0] * blockMAXElement
# 入力データ諸々
N = int(input().strip())
inputh = list(map(int,input().strip().split(' ')))
# h配列を入力データから取り出した物に置き換える
for i  in range(0,len(inputh),+1):
	h[i] = inputh[i]

# 初期の条件 0歩の時だけはコストがないので、0にセット
dp[0] = 0

def rec(position):
	# まずは最大値にセット(上でもやっているのだが)
	answer = sys.maxsize
	if position == 0:
		answer = 0
	else:
		# 貰うDPを想定して組む
		# 一つ手前の足場から来た場合
		nowCost = rec(position-1)+abs(h[position]-h[position-1])
		if nowCost < answer:
			answer=nowCost
		# 二つ手前から来た場合→position = 1では-1を参照するので不具合
		if 2 <= position :
			nowCost = rec(position-2)+abs(h[position]-h[position-2])
			if nowCost < answer:
				answer=nowCost
	# この位置についての最小値はdp配列にメモする
	dp[position] = answer
	return answer

answer = rec(N-1)
print("{}".format(answer))

Fixed submission:
# _*_ coding:utf-8 _*_
#  Atcoder_EducationDP_ContestX-1
#  TODO https://atcoder.jp/contests/dp/tasks/dp_a
#  参考文献 https://qiita.com/drken/items/dc53c683d6de8aeacf5a#%E8%A7%A3%E6%B3%95
#  C++ バージョンを上から書き下す
#  貰う型DP
import sys

# 初期化
# 足場の数となる要素数は足場の値の最大値であるMAX
blockMAXElement = 100010
blockElementRange = range(0,blockMAXElement,+1)
# DPテーブルの中身は今回は最小値を求めるため最大値を利用
dp = list()
for _ in blockElementRange:
	dp.append(sys.maxsize)

N = int(input().strip())
blockRange = range(0,N,+1)
h = list(map(int,input().strip().split(' ')))

# 初期の条件 0歩の時は値が与えられていないのでDPは0にセット
dp[0] = 0
for position in range(1,N,+1):
#   一つ手前の足場までで最適な値のはず、のコスト
	previousMinCost = dp[position-1]
#   一つ手前から来た場合の足場positionでのコスト計
#   pM = previousMin
	pMNowCost = dp[position-1]+abs(h[position]-h[position-1])
#   今の足場で設定されている足場へのコストより小さくなるならそれを改めて入れる
	if pMNowCost <= dp[position]:
		dp[position] = pMNowCost
#   これは二つ手前から来たケースを考えるのでpositon = 1の場合を除いて考える
#   それ以降は一個手前からと同じ
	if 1 < position:
		previous2MinCost = dp[position-2]
		pM2NowCost = dp[position-2]+abs(h[position]-h[position-2])
		if pM2NowCost <= dp[position]:
			dp[position] = pM2NowCost

print("{}".format(dp[N-1]))