星期一, 10月 22, 2007

又想到一些東西

題目:有一個小男孩堆積木,上下相鄰的兩塊積木,上面的底面積一定小於或等於下面的底面積,給定許多積木的長寬高,求這些積木堆出來的塔最高可到多高?(積木不一定要用完)

今天想出低工口給hint的第一題後有想出「僅限最小底面積那面向下」限制條件的解法,現在想出完全情況下的可能解法(明天驗證唄)

將輸入的積木,依照其「最小底面積」由小到大排序,命名為m1,m2,m3......,mn,其最小底面積分別為a1,a2,a3......,an。定義函數D(s,e,A)代表「使用ms至me積木,於底面積只有A的地方可堆出的最高高度」。故完整的問題為D(1,n,無限)。其中對於任一問題D(x,y,z)而言。有兩種選擇:使用my這塊積木,或不使用my這塊積木。

不使用:D(x,y,z)= D(x,y-1,z)
使用:因為my這塊積木有三面,可以讓其中任何一面向下,令A代表向下那面的底面積,令p代表一整數,使ap<=A<a(p+1)。則D(x,y,z)= D(x,y-1,ay)+ D(y+1,p,A)。把遞迴轉建表的方法大概是畫樹,但比賽中我可能會用蓋表格的遞迴(倒過來DFS)來替代吧。至於base case,則是x=y時。

明天再來慢慢想其正確性好了。 全文連結

0 意見: