72分求助
查看原帖
72分求助
69042
abdkxk楼主2020/10/23 19:13

没想出 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;
}
2020/10/23 19:13
加载中...