没想出 dp,写了搜索,T两个点
尝试记忆化,但没有成功
本题是否能用搜索过掉?
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
int n, ans=1e9+7, sum, a[20010][3], b[20010][3];
void dfs(int x, int loc, int lr, int cnt)
{
if(x == n + 2)
{
if(cnt < ans)
ans = cnt;
return;
}
if(b[x][lr] < cnt)
return;
else
b[x][lr] = cnt;
//cout<< x <<" "<< loc <<" "<< lr <<" "<< cnt <<" "<< b[x][lr] <<endl;
//cout<< "x=" << x <<" "<< cnt <<endl;
if(loc >= a[x+1][2])
{
cnt += loc - a[x+1][1];
if(cnt >= ans)
return;
dfs(x+1, a[x+1][1], 1, cnt);
}
else if(loc <= a[x+1][1])
{
cnt += a[x+1][2] - loc;
if(cnt >= ans)
return;
dfs(x+1, a[x+1][2], 2, cnt);
}
else
{
cnt += a[x+1][2] - loc + 2*(loc - a[x+1][1]);
if(cnt >= ans)
return;
dfs(x+1, a[x+1][2], 2, cnt);
cnt -= a[x+1][2] - loc + 2*(loc - a[x+1][1]);
cnt += 2*(a[x+1][2] - loc) + loc - a[x+1][1];
if(cnt >= ans)
return;
dfs(x+1, a[x+1][1], 1, cnt);
}
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d %d", &a[i][1], &a[i][2]);
sum += a[i][2] - a[i][1];
b[i][1] = b[i][2] = 1e9+7;
}
a[n+1][1] = a[n+1][2] = n;
a[n+2][1] = a[n+1][2] = n;
b[n+1][1] = b[n+1][2] = 1e9+7;
b[n+2][1] = b[n+2][2] = 1e9+7;
int cnt = 0;
cnt += n-1;
cnt += a[1][2] - 1;
dfs(1, a[1][2], 2, cnt);
printf("%d", ans);
return 0;
}