巴比倫塔 uva437與最長上公升子串行

2021-08-15 04:56:02 字數 2319 閱讀 5416

題意:有n(n≤30)種立方體,每種有無窮多個。要求選一些立方體摞成一根盡量高的柱子(可以自行選擇哪一條邊作為高),使得每個立方體的底面長寬分別嚴格小於它下方立方體的底面長寬。

樣例輸入:

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模型,可以套用最長路演算法。

有乙個問題是立方體的長和寬可能會很大,所以這裡建議採用標記序號的方式來代替二元組的兩個值,例如狀態(3,1)表示的就是第三個立方體,高度為這組值的第乙個值。

**:

#include

#include

using

namespace

std;

#define max 1024

bool g[max][max];

int dp[max][max], a[max][5];

struct node arr[max];

int t;

int n;

bool init()

sort(a[i], a[i] + 4);

arr[++t].x = a[i][1];

arr[t].y = a[i][2];

arr[t].z = a[i][3];

arr[++t].x = a[i][1];

arr[t].y = a[i][3];

arr[t].z = a[i][2];

arr[++t].x = a[i][2];

arr[t].y = a[i][3];

arr[t].z = a[i][1];}}

memset(dp, -1, sizeof(dp));

return

true;

}void creat()

}int f(int up, int down)

if (ans == -1)ans = arr[up].z + arr[down].z;

return ans;

}int main(void)

cout

<< maxn << endl;

}system("pause");

return

0;}

我還見到了另一種解法,說是可以用最長上公升子串行的方法來解決,我是沒理解,這裡只貼上**吧。在貼之前先寫上最長上公升子串行的**吧,畢竟我經常忘記。

#include

#include

using

namespace

std;

#define max 100

int num[max];

int a[max];

int n;

int f(int x) }}

return best;

}int main(void)

巴比倫塔的lis解法:

#include

using

namespace

std;

const

int n = 35;

struct block

bk[n * 3];

int n;

int d[n * 3];

int cmp(block a, block b)

int main()

sort(bk, bk + k, cmp);

int m = 0;

for (int i = 0; i < k; i++)

} if (d[i] > m)

m = d[i];

} printf("case %d: maximum height = %d\n", cas++, m);

} }

lis**取自:

uva437 巴比倫塔

題意 見紫書 題解 一道水得不能再水的大水題,卻讓我給想多了 每種立方體的長寬高有6種不同的情況,把輸入的拆成6個來考慮 用最長上公升子串行的思維,狀態轉移方程 dp i max dp i dp j p i h 因為開始時立方體是無序的,所以按長或者寬或者什麼神奇的東西拍個序 使能夠讓第i個立方體堆...

27 巴比倫塔 UVa 437

有n n 30 n n 30 n n 30 種立方體,每種都有無窮多個。要求選一些立方體摞成一根盡量高的柱子 可以自行選擇哪一條邊作為高 使得每個立方體的底面長寬分別嚴格小於它下方立方體的底面長寬。include include include include using namespace std...

紫書 UVa437巴比倫塔

題解 這個就是矩形巢狀的改變,把2d變為3d了,然後加1變為加上他們的高度 注意點是乙個矩形可以有三種不同的形態 include include include using namespace std int n int p 儲存各個矩形的數量,乙個矩形有三種 struct juxju 910 in...