import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

public class Main {

	static Scanner sc = new Scanner(System.in);

	static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	/**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	}
	/*
	static void hz_COMinit(long fac[], long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = (BigInteger.valueOf(fac[i - 1]).multiply(BigInteger.valueOf(i)).mod(BigInteger.valueOf(MOD))).longValue();
	        inv[i] = (BigInteger.valueOf(MOD).subtract(BigInteger.valueOf(inv[(int)(MOD%i)]).multiply(BigInteger.valueOf(MOD/i)).mod(BigInteger.valueOf(MOD)))).longValue();
	        finv[i] = (BigInteger.valueOf(finv[i - 1]).multiply(BigInteger.valueOf(inv[i])).mod(BigInteger.valueOf(MOD))).longValue();
	    }
	}
	*/


	/**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	}
	/*
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return BigInteger.valueOf(fac[n])
	    			.multiply(BigInteger.valueOf(finv[k])
	    					.multiply(BigInteger.valueOf(finv[n - k]))
	    					.mod(BigInteger.valueOf(MOD))
	    					)
	    			.mod(BigInteger.valueOf(MOD)).longValue();
	}
	*/

	static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	}

	//Union Find Tree
	static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	}


	public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	}
  
  	public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	}
} import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.math.BigDecimal; BigDecimal java.math import java.math.BigInteger; BigInteger java.math import java.util.ArrayDeque; ArrayDeque java.util import java.util.ArrayList; ArrayList java.util import java.util.Arrays; Arrays java.util import java.util.Collections; Collections java.util import java.util.Comparator; Comparator java.util import java.util.HashMap; HashMap java.util import java.util.HashSet; HashSet java.util import java.util.List; List java.util import java.util.Map; Map java.util import java.util.Map.Entry; Entry java.util.Map import java.util.NoSuchElementException; NoSuchElementException java.util import java.util.PriorityQueue; PriorityQueue java.util import java.util.Queue; Queue java.util import java.util.Scanner; Scanner java.util import java.util.Set; Set java.util import java.util.TreeMap; TreeMap java.util public class Main {

	static Scanner sc = new Scanner(System.in);

	static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	/**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	}
	/*
	static void hz_COMinit(long fac[], long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = (BigInteger.valueOf(fac[i - 1]).multiply(BigInteger.valueOf(i)).mod(BigInteger.valueOf(MOD))).longValue();
	        inv[i] = (BigInteger.valueOf(MOD).subtract(BigInteger.valueOf(inv[(int)(MOD%i)]).multiply(BigInteger.valueOf(MOD/i)).mod(BigInteger.valueOf(MOD)))).longValue();
	        finv[i] = (BigInteger.valueOf(finv[i - 1]).multiply(BigInteger.valueOf(inv[i])).mod(BigInteger.valueOf(MOD))).longValue();
	    }
	}
	*/


	/**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	}
	/*
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return BigInteger.valueOf(fac[n])
	    			.multiply(BigInteger.valueOf(finv[k])
	    					.multiply(BigInteger.valueOf(finv[n - k]))
	    					.mod(BigInteger.valueOf(MOD))
	    					)
	    			.mod(BigInteger.valueOf(MOD)).longValue();
	}
	*/

	static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	}

	//Union Find Tree
	static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	}


	public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	}
  
  	public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	}
} Main static Scanner sc = new Scanner(System.in); sc new Scanner(System.in) /**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	} hz_COMinit {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	} fac[0] = fac[1] = 1L fac[0] fac 0 fac[1] = 1L fac[1] fac 1 1L finv[0] = finv[1] = 1L finv[0] finv 0 finv[1] = 1L finv[1] finv 1 1L inv[1] = 1L inv[1] inv 1 1L for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    } int i = 2; int i = 2; i 2 i < MAX i MAX i++ i++ i {
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    } {
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    } fac[i] = fac[i - 1] * i % MOD fac[i] fac i fac[i - 1] * i % MOD fac[i - 1] * i fac[i - 1] fac i - 1 i 1 i MOD inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD inv[i] inv i MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD MOD inv[(int)(MOD%i)] * (MOD / i) % MOD inv[(int)(MOD%i)] * (MOD / i) inv[(int)(MOD%i)] inv (int)(MOD%i) MOD i (MOD / i) MOD i MOD finv[i] = finv[i - 1] * inv[i] % MOD finv[i] finv i finv[i - 1] * inv[i] % MOD finv[i - 1] * inv[i] finv[i - 1] finv i - 1 i 1 inv[i] inv i MOD long fac[] fac long finv[] finv long inv[] inv final int MAX MAX final long MOD MOD /**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	} hz_COM {
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	} if (n < k) return 0; n < k n k return 0; 0 if (n < 0 || k < 0) return 0; n < 0 || k < 0 n < 0 n 0 k < 0 k 0 return 0; 0 return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD; fac[n]*(finv[k]*finv[n - k] %MOD )%MOD fac[n]*(finv[k]*finv[n - k] %MOD ) fac[n] fac n (finv[k]*finv[n - k] %MOD ) finv[k]*finv[n - k] finv[k] finv k finv[n - k] finv n - k n k MOD MOD long fac[] fac long finv[] finv int n n int k k final long MOD MOD static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	} hz_swap {
		if(a >= b) return a;
		else return b;
	} if(a >= b) return a;
		else return b; a >= b a b return a; a return b; b long a a long b b public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	} main {

		solve_ac_EducationalDPContest_a();
	} solve_ac_EducationalDPContest_a() solve_ac_EducationalDPContest_a String[] args args public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	} solve_ac_EducationalDPContest_a {

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	} FastScanner sc = new FastScanner(System.in); sc new FastScanner(System.in) int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc int[] h = new int[n+3]; h new int[n+3] n+3 n 3 for(int i=1;i<=n;i++) h[i] = sc.nextInt(); int i=1; int i=1; i 1 i<=n i n i++ i++ i h[i] = sc.nextInt(); h[i] = sc.nextInt() h[i] h i sc.nextInt() sc.nextInt sc long[] dp = new long [n+3]; dp new long [n+3] n+3 n 3 Arrays.fill(dp, Long.MAX_VALUE) Arrays.fill Arrays dp Long.MAX_VALUE Long Long.MAX_VALUE dp[1] = 0 dp[1] dp 1 0 for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		} int i=1; int i=1; i 1 i<=n i n i++ i++ i {
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		} {
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		} dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]) dp[i + 1] dp i + 1 i 1 Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]) Math.min Math dp[i+1] dp i+1 i 1 Math.abs(h[i] - h[i+1]) + dp[i] Math.abs(h[i] - h[i+1]) Math.abs Math h[i] - h[i+1] h[i] h i h[i+1] h i+1 i 1 dp[i] dp i dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]) dp[i + 2] dp i + 2 i 2 Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]) Math.min Math dp[i+2] dp i+2 i 2 Math.abs(h[i] - h[i+2]) + dp[i] Math.abs(h[i] - h[i+2]) Math.abs Math h[i] - h[i+2] h[i] h i h[i+2] h i+2 i 2 dp[i] dp i System.out.println(dp[n]) System.out.println System.out System System.out dp[n] dp n static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	} FastScanner private final InputStream in; in private final byte[] buffer = new byte[1024]; buffer new byte[1024] 1024 private int ptr = 0; ptr 0 private int buflen = 0; buflen 0 public FastScanner(InputStream source) {
			in = source;
		} FastScanner {
			in = source;
		} in = source in source InputStream source source private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		} hasNextByte {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		} if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			} ptr < buflen ptr buflen {
				return true;
			} return true; true {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			} ptr = 0 ptr 0 try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} IOException e {
					e.printStackTrace();
				} e.printStackTrace() e.printStackTrace e {
					buflen = in.read(buffer);
				} buflen = in.read(buffer) buflen in.read(buffer) in.read in buffer if (buflen <= 0) {
					return false;
				} buflen <= 0 buflen 0 {
					return false;
				} return false; false return true; true private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		} readByte {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		} if (hasNextByte()) return buffer[ptr++];
			else return -1; hasNextByte() hasNextByte return buffer[ptr++]; buffer[ptr++] buffer ptr++ ptr return -1; -1 1 private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		} isPrintableChar {
			return 33 <= c && c <= 126;
		} return 33 <= c && c <= 126; 33 <= c && c <= 126 33 <= c 33 c c <= 126 c 126 int c c public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		} hasNext {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		} while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++; hasNextByte() && !isPrintableChar(buffer[ptr]) hasNextByte() hasNextByte !isPrintableChar(buffer[ptr]) isPrintableChar(buffer[ptr]) isPrintableChar buffer[ptr] buffer ptr ptr++ ptr return hasNextByte(); hasNextByte() hasNextByte public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		} next {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		} if (!hasNext()) throw new NoSuchElementException(); !hasNext() hasNext() hasNext throw new NoSuchElementException(); new NoSuchElementException() StringBuilder sb = new StringBuilder(); sb new StringBuilder() int b = readByte(); b readByte() readByte while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			} isPrintableChar(b) isPrintableChar b {
				sb.appendCodePoint(b);
				b = readByte();
			} sb.appendCodePoint(b) sb.appendCodePoint sb b b = readByte() b readByte() readByte return sb.toString(); sb.toString() sb.toString sb public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		} nextLong {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		} if (!hasNext()) throw new NoSuchElementException(); !hasNext() hasNext() hasNext throw new NoSuchElementException(); new NoSuchElementException() long n = 0; n 0 boolean minus = false; minus false int b = readByte(); b readByte() readByte if (b == '-') {
				minus = true;
				b = readByte();
			} b == '-' b '-' {
				minus = true;
				b = readByte();
			} minus = true minus true b = readByte() b readByte() readByte if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			} b < '0' || '9' < b b < '0' b '0' '9' < b '9' b {
				throw new NumberFormatException();
			} throw new NumberFormatException(); new NumberFormatException() while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			} true {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			} if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				} '0' <= b && b <= '9' '0' <= b '0' b b <= '9' b '9' {
					n *= 10;
					n += b - '0';
				} n *= 10 n 10 n += b - '0' n b - '0' b '0' if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				} b == -1 || !isPrintableChar(b) b == -1 b -1 1 !isPrintableChar(b) isPrintableChar(b) isPrintableChar b {
					return minus ? -n : n;
				} return minus ? -n : n; minus ? -n : n minus -n n n {
					throw new NumberFormatException();
				} throw new NumberFormatException(); new NumberFormatException() b = readByte() b readByte() readByte public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		} nextInt {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		} long nl = nextLong(); nl nextLong() nextLong if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException(); nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE nl < Integer.MIN_VALUE nl Integer.MIN_VALUE Integer Integer.MIN_VALUE nl > Integer.MAX_VALUE nl Integer.MAX_VALUE Integer Integer.MAX_VALUE throw new NumberFormatException(); new NumberFormatException() return (int) nl; (int) nl public double nextDouble() {
			return Double.parseDouble(next());
		} nextDouble {
			return Double.parseDouble(next());
		} return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	} HZ_UF public int[] par; par public int[] rank; rank public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		} HZ_UF {
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		} this.par = new int[n + 1] this.par this this.par new int[n + 1] n + 1 n 1 this.rank = new int[n + 1] this.rank this this.rank new int[n + 1] n + 1 n 1 Arrays.fill(par, -1) Arrays.fill Arrays par -1 1 Arrays.fill(rank, 0) Arrays.fill Arrays rank 0 int n n public void unite(int x, int y){
			link(root(x), root(y));
		} unite {
			link(root(x), root(y));
		} link(root(x), root(y)) link root(x) root x root(y) root y int x x int y y public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		} link {
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		} if(x == y) return false; x == y x y return false; false if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			} rank[x] > rank[y] rank[x] rank x rank[y] rank y {
				par[x] += par[y];
				par[y] = x;
			} par[x] += par[y] par[x] par x par[y] par y par[y] = x par[y] par y x {
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			} par[y] += par[x] par[y] par y par[x] par x par[x] = y par[x] par x y if(rank[x] == rank[y]) rank[y]++; rank[x] == rank[y] rank[x] rank x rank[y] rank y rank[y]++ rank[y] rank y return true; true int x x int y y public boolean isSame(int x, int y){
			return root(x) == root(y);
		} isSame {
			return root(x) == root(y);
		} return root(x) == root(y); root(x) == root(y) root(x) root x root(y) root y int x x int y y public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		} root {
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		} if(par[x] < 0)	return x;
			else	return x = root(par[x]); par[x] < 0 par[x] par x 0 return x; x return x = root(par[x]); x = root(par[x]) x root(par[x]) root par[x] par x int x x public int size(int x){
			return -par[root(x)];
		} size {
			return -par[root(x)];
		} return -par[root(x)]; -par[root(x)] par[root(x)] par root(x) root x int x x public class Main {

	static Scanner sc = new Scanner(System.in);

	static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	/**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	}
	/*
	static void hz_COMinit(long fac[], long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = (BigInteger.valueOf(fac[i - 1]).multiply(BigInteger.valueOf(i)).mod(BigInteger.valueOf(MOD))).longValue();
	        inv[i] = (BigInteger.valueOf(MOD).subtract(BigInteger.valueOf(inv[(int)(MOD%i)]).multiply(BigInteger.valueOf(MOD/i)).mod(BigInteger.valueOf(MOD)))).longValue();
	        finv[i] = (BigInteger.valueOf(finv[i - 1]).multiply(BigInteger.valueOf(inv[i])).mod(BigInteger.valueOf(MOD))).longValue();
	    }
	}
	*/


	/**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	}
	/*
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return BigInteger.valueOf(fac[n])
	    			.multiply(BigInteger.valueOf(finv[k])
	    					.multiply(BigInteger.valueOf(finv[n - k]))
	    					.mod(BigInteger.valueOf(MOD))
	    					)
	    			.mod(BigInteger.valueOf(MOD)).longValue();
	}
	*/

	static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	}

	//Union Find Tree
	static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	}


	public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	}
  
  	public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	}
} public class Main {

	static Scanner sc = new Scanner(System.in);

	static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	/**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	}
	/*
	static void hz_COMinit(long fac[], long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = (BigInteger.valueOf(fac[i - 1]).multiply(BigInteger.valueOf(i)).mod(BigInteger.valueOf(MOD))).longValue();
	        inv[i] = (BigInteger.valueOf(MOD).subtract(BigInteger.valueOf(inv[(int)(MOD%i)]).multiply(BigInteger.valueOf(MOD/i)).mod(BigInteger.valueOf(MOD)))).longValue();
	        finv[i] = (BigInteger.valueOf(finv[i - 1]).multiply(BigInteger.valueOf(inv[i])).mod(BigInteger.valueOf(MOD))).longValue();
	    }
	}
	*/


	/**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	}
	/*
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return BigInteger.valueOf(fac[n])
	    			.multiply(BigInteger.valueOf(finv[k])
	    					.multiply(BigInteger.valueOf(finv[n - k]))
	    					.mod(BigInteger.valueOf(MOD))
	    					)
	    			.mod(BigInteger.valueOf(MOD)).longValue();
	}
	*/

	static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	}

	//Union Find Tree
	static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	}


	public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	}
  
  	public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	}
} Main
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

public class Main {

	static Scanner sc = new Scanner(System.in);

	static class FastScanner {
		private final InputStream in;
		private final byte[] buffer = new byte[1024];
		private int ptr = 0;
		private int buflen = 0;

		public FastScanner(InputStream source) {
			in = source;
		}

		private boolean hasNextByte() {
			if (ptr < buflen) {
				return true;
			} else {
				ptr = 0;
				try {
					buflen = in.read(buffer);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (buflen <= 0) {
					return false;
				}
			}
			return true;
		}

		private int readByte() {
			if (hasNextByte()) return buffer[ptr++];
			else return -1;
		}

		private static boolean isPrintableChar(int c) {
			return 33 <= c && c <= 126;
		}

		public boolean hasNext() {
			while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
			return hasNextByte();
		}

		public String next() {
			if (!hasNext()) throw new NoSuchElementException();
			StringBuilder sb = new StringBuilder();
			int b = readByte();
			while (isPrintableChar(b)) {
				sb.appendCodePoint(b);
				b = readByte();
			}
			return sb.toString();
		}

		public long nextLong() {
			if (!hasNext()) throw new NoSuchElementException();
			long n = 0;
			boolean minus = false;
			int b = readByte();
			if (b == '-') {
				minus = true;
				b = readByte();
			}
			if (b < '0' || '9' < b) {
				throw new NumberFormatException();
			}
			while (true) {
				if ('0' <= b && b <= '9') {
					n *= 10;
					n += b - '0';
				} else if (b == -1 || !isPrintableChar(b)) {
					return minus ? -n : n;
				} else {
					throw new NumberFormatException();
				}
				b = readByte();
			}
		}

		public int nextInt() {
			long nl = nextLong();
			if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
				throw new NumberFormatException();
			return (int) nl;
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}
	}

	/**
	 * Compute n! mod. p, (n!)^(-1) mod.p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @param MAX 		:
	 * @param MOD 		:
	 */

	static void hz_COMinit(long fac[],long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = fac[i - 1] * i % MOD;
	        inv[i] = MOD - inv[(int)(MOD%i)] * (MOD / i) % MOD;
	        finv[i] = finv[i - 1] * inv[i] % MOD;
	    }
	}
	/*
	static void hz_COMinit(long fac[], long finv[], long inv[],final int MAX, final long MOD) {
	    fac[0] = fac[1] = 1L;
	    finv[0] = finv[1] = 1L;
	    inv[1] = 1L;
	    for (int i = 2; i < MAX; i++){
	        fac[i] = (BigInteger.valueOf(fac[i - 1]).multiply(BigInteger.valueOf(i)).mod(BigInteger.valueOf(MOD))).longValue();
	        inv[i] = (BigInteger.valueOf(MOD).subtract(BigInteger.valueOf(inv[(int)(MOD%i)]).multiply(BigInteger.valueOf(MOD/i)).mod(BigInteger.valueOf(MOD)))).longValue();
	        finv[i] = (BigInteger.valueOf(finv[i - 1]).multiply(BigInteger.valueOf(inv[i])).mod(BigInteger.valueOf(MOD))).longValue();
	    }
	}
	*/


	/**
	 * @Compute nCk(二項係数計算) mod. p
	 * @param fac[]		: n! mod. p
	 * @param finv[]	: (n!)^(-1) mod. p
	 * @return 			:nCk(二項係数計算) mod. p
	 */
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n]*(finv[k]*finv[n - k] %MOD )%MOD;
	}
	/*
	static long hz_COM(long fac[],long finv[], int n, int k, final long MOD){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return BigInteger.valueOf(fac[n])
	    			.multiply(BigInteger.valueOf(finv[k])
	    					.multiply(BigInteger.valueOf(finv[n - k]))
	    					.mod(BigInteger.valueOf(MOD))
	    					)
	    			.mod(BigInteger.valueOf(MOD)).longValue();
	}
	*/

	static long hz_swap(long a, long b){
		if(a >= b) return a;
		else return b;
	}

	//Union Find Tree
	static class HZ_UF{

		public int[] par;
		public int[] rank;

		public HZ_UF(int n){
			this.par = new int[n + 1];
			this.rank = new int[n + 1];

			Arrays.fill(par, -1);
			Arrays.fill(rank, 0);
		}

		public void unite(int x, int y){
			link(root(x), root(y));
		}

		public boolean link(int x, int y){
			if(x == y) return false;
			if(rank[x] > rank[y]){
				par[x] += par[y];
				par[y] = x;
			}
			else{
				par[y] += par[x];
				par[x] = y;
				if(rank[x] == rank[y]) rank[y]++;
			}
			return true;
		}

		public boolean isSame(int x, int y){
			return root(x) == root(y);
		}

		public int root(int x){
			if(par[x] < 0)	return x;
			else	return x = root(par[x]);
		}

		public int size(int x){
			return -par[root(x)];
		}
	}


	public static void main(String[] args){

		solve_ac_EducationalDPContest_a();
	}
  
  	public static void solve_ac_EducationalDPContest_a(){

		FastScanner sc = new FastScanner(System.in);
		
		int n = sc.nextInt();
		int[] h = new int[n+3];
		for(int i=1;i<=n;i++) h[i] = sc.nextInt();
		
		long[] dp = new long [n+3];
		Arrays.fill(dp, Long.MAX_VALUE);
		
		dp[1] = 0;
		
		for(int i=1;i<=n;i++){
			dp[i + 1] = Math.min(dp[i+1], Math.abs(h[i] - h[i+1]) + dp[i]);
			dp[i + 2] = Math.min(dp[i+2], Math.abs(h[i] - h[i+2]) + dp[i]);
		}
		
		System.out.println(dp[n]);
	}
}