洛谷 P3842 [TJOI2007]线段 DP
给一个 的平面,每一行有一个线段,左右端点 ,满足
从 出发,要求走过所有线段,到达 ,要求总路程尽可能短。
每次只能向下/左/右,每行的线段要走走完。
思路:用 表示走完 行后停留在左端点的最少步数, 表示走完 行后停留在右端点的最少步数。
举一半例子:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN 20010
using namespace std;
int n,l[MAXN],r[MAXN],f[MAXN][2],res;
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);
f[1][0]=r[1]-l[1]+r[1]-1; // 初始化
f[1][1]=r[1]-1;
for(int i=2;i<=n;i++){
f[i][0]=min(f[i-1][0]+abs(r[i]-l[i-1]),f[i-1][1]+abs(r[i]-r[i-1]))+r[i]-l[i]+1;
f[i][1]=min(f[i-1][0]+abs(l[i]-l[i-1]),f[i-1][1]+abs(l[i]-r[i-1]))+r[i]-l[i]+1;
}
res=min(f[n][0]+n-l[n],f[n][1]+n-r[n]);
printf("%d\n",res);
return 0;
}