思路:
- 另一种动归思路:从最优子结构入手,属于查表填格的做法。
- 借鉴自_pkm_的BLOG。
代码:
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1005;
int T;
int N,X,Y,M;
int dp[maxn][2];
struct NODE{
int l,r,h;
friend bool operator < (NODE a,NODE b)
{
return a.h < b.h;
}
}node[maxn];
void ADDNODE(int i,int l,int r,int h){
node[i].l = l;
node[i].r = r;
node[i].h = h;
return ;
}
void SOLVE(){
for(int i=0;i<N;i++){
int j;
for(j=i-1;j>=0;j--)
if(node[j].l <= node[i].l && node[j].r >= node[i].l && node[i].h - node[j].h <= M)
break;
if(j == -1){
if(node[i].h > M)
dp[i][0] = INF;
else
dp[i][0] = node[i].h;
}
else
dp[i][0] = node[i].h - node[j].h + min(dp[j][0] + node[i].l - node[j].l , dp[j][1] + node[j].r - node[i].l);
for(j=i-1;j>=0;j--)
if(node[j].l <= node[i].r && node[j].r >= node[i].r && node[i].h - node[j].h <= M)
break;
if(j == -1){
if(node[i].h > M)
dp[i][1] = INF;
else
dp[i][1] = node[i].h;
}
else
dp[i][1] = node[i].h - node[j].h + min(dp[j][0] + node[i].r - node[j].l , dp[j][1] + node[j].r - node[i].r);
}
return ;
}
int main(){
cin>>T;
while(T--){
cin>>N>>X>>Y>>M;
for(int i=0;i<N;i++){
int l,r,h;
scanf("%d%d%d" , &l , &r , &h);
ADDNODE(i,l,r,h);
}
sort(node , node + N);
SOLVE();
int i;
for(i = N-1 ; i>=0 ; i--)
if(node[i].l <= X && node[i].r >= X && Y - node[i].h <= M)
break;
if(i == -1)
cout<<Y<<endl;
else
cout<<Y - node[i].h + min(dp[i][0] + X - node[i].l , dp[i][1] + node[i].r - X)<<endl;
}
return 0;
}