hdu1069(lis的長方體堆疊模型)

2021-07-24 04:50:20 字數 1276 閱讀 7369

/*

translation:

給出n中不同型別的石塊,每種型別的石塊長寬高都不一樣。對於兩塊石塊a,b。只有當a的底面的長寬嚴格小於b的長寬時,

a才能擺放在b的上面。問最多能夠將石塊疊加到多高。

solution:

lis的長方體堆疊模型,dp

這道題很明顯使用dp來做,(其實用搜尋也可以吧,資料量不是很大)具體做法是先按照長寬或者寬長對各類的長方體進行排列。然後在直接套上lis的模型即可。

注意每個長方體有6種不同的擺放狀態。所以可以將其看成6個型別的長方體。這樣就好處理了。還要注意的是一旦用上一類

長方體,在接下來就不可能再次用到了。所以還可以將每個型別長方體看成只有乙個。

note:

# 原本想的是可能是揹包模型,後來仔細觀察發現堆疊的順序是有講究的,就想是否是lis。但是又被我否決了,因為lis的

順序是按照已經給出的順序不變的。而此題明顯取走兩種石塊時是可以不按照輸入順序的。總不能預先排序再dp吧?那是肯定不可能

的!最後實在想不出來了,看了下題解,我草還真是預先排序......我這嘴tm開過光......

* lis的長方體堆疊模型,仔細想了一下,這種模型還有可能被用來考察dilworth定理。先rt下。

date:

2016.10.29

*/#include #include #include #include #include using namespace std;

const int maxn = 35;

const int inf = 1e8;

struct block

};vectorb;

int n, dp[maxn*6];

bool cmp(const block& lhs, const block& rhs)

bool inside(int i, int j) //i可以巢狀在j上面

int main()

n = b.size();

sort(b.begin(), b.end(), cmp);

memset(dp, 0, sizeof(dp));

int ans = -inf;

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

ans = max(ans, dp[i]);

} ans = max(0, ans);

printf("case %d: maximum height = %d\n", ++t, ans);

}return 0;

}

hdu2436 判斷 球與長方體相交

hdu2436 判斷球與長方體 與座標軸平行 是否相交,之前沒看清題目,就把長方體和球三維旋轉了。思路是找長方體與球的最近距離,再和半相比。後來沒有用64位wa的找不著北了。ac 如下 include include includeusing namespace std define eps 1e ...

長方體類中的建構函式

源程式 程式頭部注釋開始 程式的版權和版本宣告部分 檔名稱 建構函式編寫長方體類 作 者 114 3 張宗佳 完成日期 2012 年 3 月 21 日 版 本 號 vc.3 對任務及求解方法的描述部分 輸入描述 前4個長方柱 即陣列的前4個元素 要在定義陣列時初始化,其中前3個直接給出引數初始化,第...

SXF2019長方體的擺放

乙個長方體,長寬高分別為x,y,z,都為自然數。現在要把若干個相同的長方體擺成高為n的一根柱形體。每層擺1個,如果兩種擺法的高度是一樣的,則認為這兩種擺法等價,所以每層只有三種擺法。求一共有多少種擺法。輸入描述 第一行為乙個數字n,n 1且n 100,表示要擺放的高度 第二行為長方體的長寬高,x y...