NOI1997 積木遊戲 dp

2022-04-06 02:10:23 字數 1539 閱讀 4673

★★   輸入檔案:buildinggame.in輸出檔案:buildinggame.out簡單對比

時間限制:1 s   記憶體限制:128 mb

sercoi 最近設計了一種積木遊戲。每個遊戲者有n塊編號依次為1 ,2,…,n的長方體積木。對於每塊積木,它的三條不同的邊分別稱為」a邊」、「b邊」和」c邊」,如下圖所示:

遊戲規則如下:

從n塊積木中選出若干塊,並將它們分成m(l<=m<=n) 堆,稱為第1堆,第2 堆…,第m堆。每堆至少有1塊積木,並且第k堆中任意一塊積木的編號要大於第k+1堆中任意一塊積木的編號(2<=k<=m)。

對於每一堆積木,遊戲者要將它們垂直摞成一根柱子,並要求滿足下面兩個條件:

除最頂上的一塊積木外,任意一塊積木的上表面同且僅同另一塊積木的下表面接觸,並且要求下面的積木的上表面能包含上面的積木的下表面,也就是說,要求下面的積木的上表面的兩對邊的長度分別大於等於上面的積木的兩對邊的長度。

對於任意兩塊上下表面相接觸的積木,下面的積木的編號要小於上面的積木的編號。

最後,根據每人所摞成的m根柱子的高度之和來決出勝負。

請你編一程式,尋找一種摞積木的方案,使得你所摞成的m根柱子的高度之和最大。

輸入檔案的第一行有兩個正整數n和m(1<=m<=n<=100),分別表示積木總數和要求 摞成的柱子數。這兩個數之間用乙個空格符隔開。接下來n行依次是編號從1到n的n個積木的尺寸,每行有三個1至1000之間的整數,分別表示該積木a 邊,b邊和c邊的長度。同一行相鄰兩個數之間用乙個空格符隔開。

輸出檔案只有一行,為乙個整數,表示m根柱子的高度之和。

輸入檔案

421055877222666

輸出檔案

24

/*

f[k][i][j][l] 表示 前i個積木分為k組,第k組最後乙個是j,j的擺放方式為l的最大高度

為了方便比較大小關係,可以先對輸入每塊積木的a,b,c排序,這樣在dp中就不用判斷同一塊積木的長寬高

排序方式,每塊積木最小的引數為a,中間的是b,最大的為c

狀態表示方法:

0 表示 ab面為底;1 表示 ac面為底; 2表示bc面為底

*/#include

#include

using

namespace

std;

int n,m,a[101],b[101],c[101],f[101][101][101][3

];int

main()

for(int k=1;k<=m;k++)

for(int i=1;i<=n;i++)

for(int j=0;j)

for(int l=0;l<=2;l++)

int ans=0

;

for(int i=1;i<=n;i++)

for(int j=0;j<=2;j++)

ans=max(ans,f[m][n][i][j]);

printf("%d

",ans);

}

1722 最優乘車 2023年NOI全國競賽

題目描述 description h城是乙個旅遊勝地,每年都有成千上萬的人前來觀光。為方便遊客,巴士公司在各個旅遊景點及賓館,飯店等地都設定了巴士站並開通了一些單程巴上線路。每條單程巴士線路從某個巴士站出發,依次途經若干個巴士站,最終到達終點巴士站。一名旅客最近到h城旅遊,他很想去s公園遊玩,但如果...

題解 P5761 NOI1997 最佳遊覽

時間限制 記憶體限制 1.00s 128.00mb 題目描述 有一座旅遊城,它的街道成網格狀 如圖 其中東西向的街道是 風景線 兩旁分布著許多景觀 南北向的街道都是 林萌道 兩旁沒有任何建築物。由於遊客眾多,風景線 被規定為單行道,遊客在風景線上只能從西走到東,林蔭道上則可以任意行走。一名遊客將到這...

NOI1029 積木遊戲(dp)

include include using namespace std define max a,b ab swap a,b 將a,b,c排序 if b c swap b,c if a b swap a,b 排序後儲存時,p i j a的值始終小於p i j b的值,這樣可以使判斷是否包含時更方便 ...