日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1661 Help Jimmy DP

發布時間:2025/5/22 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1661 Help Jimmy DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目思路:狀態轉移方程很好推出,值得注意的是要分別判斷是否能從一個平臺的某側移動到另一平臺,也就是說要判斷過一個平臺的左端點或右端點做垂線,看這條垂線是否經過其他平臺。

?

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<iostream> #include<algorithm> #define INF 0x3FFFFFFF #define MAXSIZE 1005using namespace std;struct node {int x1,x2,h; }a[MAXSIZE];struct node1 {int lt,rt; }dp[MAXSIZE];int cmp(struct node A,struct node B) {return A.h > B.h; }int Check(int A,int B,int op) //OP=0 判斷左側是否聯通,op=1判斷右側是否聯通 {if(!op){for(int i=A+1;i<B;i++){if(a[A].x1>=a[i].x1 && a[A].x1<=a[i].x2)return 0;}if(a[A].x1>=a[B].x1 && a[A].x1<=a[B].x2)return 1;}else{for(int i=A+1;i<B;i++){if(a[A].x2>=a[i].x1 && a[A].x2<=a[i].x2)return 0;}if(a[A].x2>=a[B].x1 && a[A].x2<=a[B].x2)return 1;} }int main() {int maxn,T,n,X,Y;scanf("%d",&T);while(T--){scanf("%d%d%d%d",&n,&X,&Y,&maxn);for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].h);n++;a[n].x1=-20000;a[n].x2=20000;a[n].h=0;a[0].x1=X;a[0].x2=X;a[0].h=Y;sort(a,a+(n+1),cmp);dp[0].lt=dp[0].rt=0;for(int i=1;i<=n;i++)dp[i].lt=dp[i].rt=INF;for(int i=0;i<=n;i++){for(int j=0;j<i;j++){if(i==n && a[j].h-a[i].h<=maxn && a[j].h-a[i].h>0){if(a[j].x1>=a[i].x1 && a[j].x1<=a[i].x2 && Check(j,i,0)) //可從左點下落 {dp[i].lt=min(dp[i].lt,dp[j].lt+a[j].h-a[i].h);dp[i].rt=min(dp[i].rt,dp[j].lt+a[j].h-a[i].h);}if(a[j].x2>=a[i].x1 && a[j].x2<=a[i].x2 && Check(j,i,1)) //可以從右點下落 {dp[i].rt=min(dp[i].rt,dp[j].rt+a[j].h-a[i].h);dp[i].lt=min(dp[i].lt,dp[j].rt+a[j].h-a[i].h);}}else if(a[j].h-a[i].h<=maxn && a[j].h-a[i].h>0){if(a[j].x1>=a[i].x1 && a[j].x1<=a[i].x2 && Check(j,i,0)) //可從左點下落 {dp[i].lt=min(dp[i].lt,dp[j].lt+a[j].x1-a[i].x1+a[j].h-a[i].h);dp[i].rt=min(dp[i].rt,dp[j].lt+a[i].x2-a[j].x1+a[j].h-a[i].h);}if(a[j].x2>=a[i].x1 && a[j].x2<=a[i].x2 && Check(j,i,1)) //可以從右點下落 {dp[i].rt=min(dp[i].rt,dp[j].rt+a[i].x2-a[j].x2+a[j].h-a[i].h);dp[i].lt=min(dp[i].lt,dp[j].rt+a[j].x2-a[i].x1+a[j].h-a[i].h);}}}}int ans=min(dp[n].lt,dp[n].rt);printf("%d\n",ans);}return 0; } View Code

?

轉載于:https://www.cnblogs.com/alan-W/p/6395262.html

總結

以上是生活随笔為你收集整理的POJ 1661 Help Jimmy DP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。