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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

uva437巴比伦塔

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva437巴比伦塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

巴比倫人有n種長方形方塊,每種有無限個,第i種方塊的三邊邊長是xi,yi,zi。對于每一個方塊,你可以任意選擇一面作為底,這樣高就隨著確定了。舉個例子,同一種方塊,可能其中一個是豎著放的,一個是側著放的,一個是橫著放的。

他們想要用堆方塊的方式建盡可能高的塔。問題是,只有一個方塊的底的兩條邊嚴格小于另一個方塊的底的兩條邊,這個方塊才能堆在另一個上面。這意味著,一個方塊甚至不能堆在一個底的尺寸與它一樣的方塊的上面。

你的任務是編寫一個程序,計算出這個塔可以建出的最高的高度。

【輸入】

輸入會包含至少一組數據,每組數據的第一行是一個整數n(n<=30),表示方塊的種類數。 這組數據接下來的n行,每行有三個整數,表示xi,yi,zi。 輸入數據會以0結束。

【輸出】

對于每組數據,輸出一行,其中包含組號(從1開始)和塔最高的高度。按以下格式: Case : maximum height = __

【輸入樣例】

1

10 20 30

2

6 8 10

5 5 5

7

1 1 1

2 2 2

3 3 3

4 4 4

5 5 5

6 6 6

7 7 7

5

31 41 59

26 53 58

97 93 23

84 62 64

33 83 27

0

【輸出樣例】

Case 1: maximum height = 40

Case 2: maximum height = 21

Case 3: maximum height = 28

Case 4: maximum height = 342

?

一道很有意思的DAG最長路

一個長方體需要建三個點表示三種情況,記搜一下就可以了

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+5; 4 const int INF=1e9+7; 5 int x[205],y[205],z[205]; 6 int n,cas,ans,dp[205]; 7 bool g[155][155]; 8 template <class t>void red(t &x) 9 { 10 x=0; 11 int w=1; 12 char ch=getchar(); 13 while(ch<'0'||ch>'9') 14 { 15 if(ch=='-') 16 w=-1; 17 ch=getchar(); 18 } 19 while(ch>='0'&&ch<='9') 20 { 21 x=(x<<3)+(x<<1)+ch-'0'; 22 ch=getchar(); 23 } 24 x*=w; 25 } 26 void input() 27 { 28 freopen("input.txt","r",stdin); 29 } 30 bool check(int a,int b) 31 { 32 if((x[a]<x[b]&&y[a]<y[b])||(x[a]<y[b]&&y[a]<x[b])) 33 return 1; 34 return 0; 35 } 36 int solve(int u) 37 { 38 if(dp[u]) 39 return dp[u]; 40 dp[u]=z[u]; 41 for(int i=0;i<n;++i) 42 if(g[u][i]) 43 dp[u]=max(dp[u],solve(i)+z[u]); 44 return dp[u]; 45 } 46 int main() 47 { 48 input(); 49 while(scanf("%d",&n)==1&&n) 50 { 51 ++cas; 52 ans=0; 53 //memset(g,0,sizeof(g)); 54 memset(dp,0,sizeof(dp)); 55 printf("Case %d: maximum height = ",cas); 56 for(int i=0;i<n;++i) 57 { 58 red(x[i]); 59 red(y[i]); 60 red(z[i]); 61 x[i+n]=y[i]; 62 y[i+n]=z[i]; 63 z[i+n]=x[i]; 64 x[i+n+n]=z[i]; 65 y[i+n+n]=x[i]; 66 z[i+n+n]=y[i]; 67 } 68 n*=3; 69 for(int i=0;i<n;++i) 70 for(int j=i+1;j<n;++j) 71 { 72 g[i][j]=check(i,j); 73 g[j][i]=check(j,i); 74 } 75 for(int i=0;i<n;++i) 76 ans=max(ans,solve(i)); 77 printf("%d\n",ans); 78 } 79 return 0; 80 } View Code

?

轉載于:https://www.cnblogs.com/Achensy/p/10777653.html

總結

以上是生活随笔為你收集整理的uva437巴比伦塔的全部內容,希望文章能夠幫你解決所遇到的問題。

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