Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7380 | Accepted: 2333 |
Description
Input
Output
Sample Input
1 3 8 17 20 0 10 8 0 10 13 4 14 3
Sample Output
23
动态规划的题,自我感觉解释挺详细了,不懂请留言 ^_^
#include<stdio.h> #include<stdlib.h> #define INF 20005 #define MAXSIZE 1005 //N表示板子的数目,X表示横坐标,Y表示纵坐标(即高度) int N, X, Y, MAX; typedef struct Node //定义结构体 { int lx, rx, h;//分别表示左右横坐标和高度 }Node; Node platform[MAXSIZE]; int dp[MAXSIZE][2]; int cmp(const void *a,const void *b)//按照高度从大到小排序 { Node *c,*d; c=(Node *)a; d=(Node *)b; return d->h - c->h; } int DP() { int i,j,t1,t2; qsort(platform, N + 1, sizeof(platform[0]), cmp);//先把板子排好序 dp[N][0] = platform[N].h;//最后一层从左边掉到地面的高度 dp[N][1] = platform[N].h;//最后一层从右边掉到地面的高度 for(i=N-1;i>=0;i--) { //判断是否能从第i层左边掉到第j层,如果能就退出循环 for(j=i+1;j<=N;j++) { if(platform[j].lx<=platform[i].lx && platform[j].rx>=platform[i].lx) break; } if(j<=N)//如果没有直接掉到地面 { //判断两层之间的距离是否超过最大值 if(platform[i].h - platform[j].h > MAX) dp[i][0] = INF; else { //掉下后选择左边的路所耗总时间 t1 = platform[i].h - platform[j].h + platform[i].lx - platform[j].lx + dp[j][0]; //掉下后选择右边的路所耗总时间 t2 = platform[i].h - platform[j].h + platform[j].rx - platform[i].lx + dp[j][1]; //选择较小的时间 dp[i][0]=t1<t2?t1:t2; } } else//如果直接掉到地面 { if(platform[i].h > MAX) dp[i][0] = INF; else dp[i][0] = platform[i].h; } //判断是否能从第i层右边掉到第j层,如果能就退出循环 for(j=i+1;j<=N;j++) { if(platform[j].lx<=platform[i].rx&&platform[j].rx>=platform[i].rx) break; } if(j<=N)//如果没有直接掉到地面 { //判断两层之间的距离是否超过最大值 if(platform[i].h - platform[j].h > MAX) dp[i][1] = INF; else { //掉下后选择左边的路所耗总时间 t1 = platform[i].h - platform[j].h + platform[i].rx - platform[j].lx + dp[j][0]; //掉下后选择右边的路所耗总时间 t2 = platform[i].h - platform[j].h + platform[j].rx - platform[i].rx + dp[j][1]; //选择较小的时间 dp[i][1]=t1<t2?t1:t2; } } else//如果直接掉到地面 { if(platform[i].h > MAX) dp[i][1] = INF; else dp[i][1] = platform[i].h; } } return dp[0][0]; } int main() { int Test,i,j; //freopen("in.txt","r",stdin); scanf("%d",&Test); while (Test--) { scanf("%d%d%d%d",&N,&X,&Y,&MAX); platform[0].lx = X; platform[0].rx = X; platform[0].h = Y; for (i = 1; i <= N; ++ i) scanf("%d%d%d",&platform[i].lx,&platform[i].rx,&platform[i].h); memset(dp, 0, sizeof(dp)); printf("%d\n",DP()); } return 0; }