P3842 线段
思路
用 dp[i][0] 表示走到第 i 行左端点的最小步数,dp[i][1] 表示走到第 i 行右端点的最小步数,每行的每个状态都可以由上一行两个状态转化(取最小值)。
代码
#include<iostream>
#include<cmath>
#define MAXN 20010
using namespace std;
int N, Left[MAXN], Right[MAXN], dp[MAXN][2];
int length(int A, int B) { return fabs(A - B); }
int main(void)
{
cin >> N;
for (int i = 1; i <= N; i++)
cin >> Left[i] >> Right[i];
dp[1][0] = length(1, Right[1]) + length(Right[1], Left[1]);
dp[1][1] = length(1, Right[1]);
for (int i = 2; i <= N; i++)
{
dp[i][0] = min(dp[i - 1][0] + length(Left[i - 1], Right[i]) + length(Right[i], Left[i]),
dp[i - 1][1] + length(Right[i - 1],Right[i])+length(Right[i],Left[i])) + 1;
dp[i][1] = min(dp[i - 1][0] + length(Left[i - 1], Left[i])+length(Right[i],Left[i]),
dp[i - 1][1] + length(Right[i-1], Left[i]) + length(Right[i], Left[i])) + 1;
}
cout << min(dp[N][0] + length(N, Left[N]), dp[N][1] + length(N, Right[N]));
return 0;
}