这道题没有想出dp的解法,是在看了https://blog.csdn.net/qq_37605573/article/details/77366536的博客后才写出来的
#include <iostream>
#include<string.h>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
struct segment{
int x1;
int x2;
int h;
};
int n;
segment sg[1005];
bool cmp(segment &a1,segment &a2){
return a1.h>a2.h;
}
int dp[1005][2];
int maxn;
void left(int i){
int k=i+1;
while(k<n&&sg[i].h-sg[k].h<=maxn){
if(sg[k].x1<=sg[i].x1&&sg[i].x1<=sg[k].x2){
dp[i][0]=sg[i].h-sg[k].h+min(dp[k][0]+sg[i].x1-sg[k].x1,dp[k][1]+sg[k].x2-sg[i].x1);
return;
}
k++;
}
if(sg[i].h-sg[k].h>maxn){ dp[i][0]=INF;}
else {dp[i][0]=sg[i].h;}
}
void right(int i){
int k=i+1;
while(k<n&&sg[i].h-sg[k].h<=maxn){
if(sg[k].x1<=sg[i].x2&&sg[i].x2<=sg[k].x2){
dp[i][1]=sg[i].h-sg[k].h+min(dp[k][0]+sg[i].x2-sg[k].x1,dp[k][1]+sg[k].x2-sg[i].x2);
return;
}
k++;
}
if(sg[i].h-sg[k].h>maxn){
dp[i][1]=INF;
}
else{
dp[i][1]=sg[i].h;
}
}
int main()
{
int t;
cin>>t;
while(t--){
memset(dp,0,sizeof(dp));
cin>>n;
n=++n;
//cout<<n<<endl;
cin>>sg[0].x1;
sg[0].x2=sg[0].x1;
cin>>sg[0].h;
cin>>maxn;
sg[1].x1=-20000;
sg[1].x2=20000;
sg[1].h=0;
for(int i=2;i<=n;i++){
cin>>sg[i].x1>>sg[i].x2>>sg[i].h;
}
sort(sg,sg+n+1,cmp);
for(int i=n-1;i>=0;i--){
left(i);
right(i);
}
cout<<min(dp[0][0],dp[0][1])<<endl;
}
return 0;
}