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;
}