#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
int n, x[MAXN], y[MAXN];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int dp[MAXN][260005];
struct cmp {
bool operator()(const pair<int,int>& a, const pair<int,int>& b) {
return 网页链接 > b.first;
}
};
int main() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for(int i = 1; i <= n; i++) dp[i][i] = 0; //将士兵自己到自己移动步数设为0
for(int len = 2; len <= n; len++) {
for(int i = 1; i <= n - len + 1; i++) { //固定len,固定第一个士兵位置,对所有可能的情况求dp值并累加到dp数组中
int j = i + len - 1;
for(int k = 0; k < 4; k++) { //枚举方向
int nx = x[j] + dx[k];
int ny = y[j] + dy[k];
if(nx < 1 || nx > n || ny < 1 || ny > n) continue; //越界检查
dp[i][j] = min(dp[i][j], dp[i][j - 1] + abs(nx - x[i]) + abs(ny - y[i])); //更新dp值
}
}
}
int ans = INT_MAX;
for(int i = 1; i <= n; i++) ans = min(ans, dp[1][i]); //从dp数组中找到最小移动步数,注意将问题规模缩放n倍(根据乘法的逆元原理)
cout << ans << endl; //输出最小移动步数
return 0;
}
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
int n, x[MAXN], y[MAXN];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int dp[MAXN][260005];
struct cmp {
bool operator()(const pair<int,int>& a, const pair<int,int>& b) {
return 网页链接 > b.first;
}
};
int main() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for(int i = 1; i <= n; i++) dp[i][i] = 0; //将士兵自己到自己移动步数设为0
for(int len = 2; len <= n; len++) {
for(int i = 1; i <= n - len + 1; i++) { //固定len,固定第一个士兵位置,对所有可能的情况求dp值并累加到dp数组中
int j = i + len - 1;
for(int k = 0; k < 4; k++) { //枚举方向
int nx = x[j] + dx[k];
int ny = y[j] + dy[k];
if(nx < 1 || nx > n || ny < 1 || ny > n) continue; //越界检查
dp[i][j] = min(dp[i][j], dp[i][j - 1] + abs(nx - x[i]) + abs(ny - y[i])); //更新dp值
}
}
}
int ans = INT_MAX;
for(int i = 1; i <= n; i++) ans = min(ans, dp[1][i]); //从dp数组中找到最小移动步数,注意将问题规模缩放n倍(根据乘法的逆元原理)
cout << ans << endl; //输出最小移动步数
return 0;
}