POJ 1661

原题

dp解,由于才上手所以准备先写递归再写递推。

递归代码如下:

在写这个递归的时候发生了很神奇的事情,在VS上运行我总能输出正确结果而在DEVC++上却总是错的,想了很久也不知道为啥,先放这有大佬能解释一下吗?

#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int t, N, X, Y, MAX;//
struct Board {
	int l, r, h;
}b[1010];
bool cmp(Board x, Board y) {
	return x.h > y.h;
}
int judge(int index, int dir) {
	if (dir == 0) {
		for (int i = index + 1; i < N; i++) {
			if (b[i].l <= b[index].l && b[i].r >= b[index].l) {
				return i;
			}
		}
	}
	else {
		for (int i = index + 1; i < N; i++) {
			if (b[i].l <= b[index].r && b[i].r >= b[index].r) {
				return i;
			}
		}
	}
	return N + 1;
}
int findmint(int index, int dir, int x) {
	int temp = 0;
	if (dir == 0) {
		temp += x - b[index].l;
		if (judge(index, dir) < N && b[index].h - b[judge(index, dir)].h <= MAX) {
			int p = judge(index, dir);
			temp += b[index].h - b[p].h + min(findmint(p, 0, b[index].l), findmint(p, 1, b[index].l));
			//从左边落t+高度时间,现在x位置更新为当前板的左边位置 
		}
		else {
			if (b[index].h > MAX) {
				temp = INF;
			}
			else {
				temp += b[index].h;
			}
			return temp;
		}
	}
	else {
		temp += b[index].r - x;
		if (judge(index, dir) < N && b[index].h - b[judge(index, dir)].h <= MAX) {
			int p = judge(index, dir);
			temp += b[index].h - b[p].h + min(findmint(p, 0, b[index].r), findmint(p, 1, b[index].r));
		}
		else {
			if (b[index].h > MAX) {
				temp = INF;
			}
			else {
				temp += b[index].h;

			}
			return temp;
		}
	}
}
int main()
{
	cin >> t;
	while (t-- > 0) {
		cin >> N >> X >> Y >> MAX;//N块板,初始位置X,Y,下落最大高度MAX 
		for (int i = 0; i < N; i++) {
			cin >> b[i].l >> b[i].r >> b[i].h;
		}
		sort(b, b + N, cmp);
		if (b[0].l <= X && b[0].r >= X && Y - b[0].h <= MAX)
			cout << min(findmint(0, 0, X), findmint(0, 1, X)) + Y - b[0].h;
		else if (Y <= MAX) {
			cout << Y;
		}
		cout << endl;
	}

	return 0;
}

递推代码

递推的时候由于要用开始状态所以把地面看成了无穷大的板,把开始下落点看成一个高h左右x位置相同的点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int dp[1010][2];
int t, N, X, Y, MAX;//
struct Board {
	int l, r, h;
}b[1010];
bool cmp(Board x, Board y) {
	return x.h < y.h;
}

void left(int index) {
	int i = index - 1;;
		while (i > 0 && b[index].h - b[i].h <= MAX) {
			if (b[i].l <= b[index].l && b[i].r >= b[index].l) {
				dp[index][0] = b[index].h - b[i].h + min(dp[i][0]+b[index].l-b[i].l, dp[i][1]+b[i].r-b[index].l);
				return;
			}
			else {
				i--;
			}
		}
		if (b[index].h -b[i].h <= MAX)
			dp[index][0] = b[index].h;
		else
			dp[index][0] = INF;
	
}
void right(int index) {
	int i = index - 1;
	while (i > 0 && b[index].h - b[i].h <= MAX) {
		if (b[i].l <= b[index].r && b[i].r >= b[index].r) {
			dp[index][1] = b[index].h - b[i].h + min(dp[i][0] + b[index].r - b[i].l, dp[i][1] + b[i].r - b[index].r);
			return;
		}
		else {
			i--;
		}
	}
	if (b[index].h - b[i].h <= MAX)
		dp[index][1] = b[index].h;
	else 
		dp[index][1] = INF;
}
int main()
{
	cin >> t;
	while (t-- ) {
		memset(b, 0, sizeof(b));
		cin >> N >> X >> Y >> MAX;//N块板,初始位置X,Y,下落最大高度MAX 
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= N; i++) {
			cin >> b[i].l >> b[i].r >> b[i].h;
		}
		b[0].l = -20000, b[0].r = 20000, b[0].h = 0;
		b[N + 1].l= b[N + 1].r = X, b[N + 1].h = Y;
		sort(b, b + N+1, cmp);
		for (int i = 1; i <= N+1; i++) {
			left(i);
			right(i);

		}
		cout << min(dp[N+1][0], dp[N+1][1]) << endl;
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值