d042: 11420 - Chest of Drawers
出處
http://zerojudge.tw/ShowProblem?problemid=d042
內容 :
斗櫃就是如左圖由很多抽屜垂直排列組成的櫃子。雖然這是個很有用的家具,但是如果要鎖這些抽屜時卻發生了問題——抽屜即使上鎖了也不一定安全。例如假設從上面往下數第三個抽屜鎖上了,但是它上面的那個抽屜卻沒鎖。這時鎖起來的抽屜也不安全,因為只要把它上面的抽屜整個拉出來就可拿到裡面的東西了。
一個 n 個抽屜的斗櫃,會有數個方式來確保剛好有 s 個抽屜是安全的。以左圖的斗櫃為例,有六個方式可以確保剛好四個抽屜是安全的。這六個方式如圖 2 所示。
給你 n 和 s 的值,請你算有多少個方式可以確保它們的安全。
圖 2: 圖中的 L 表示那個抽屜是鎖著的,U 則表示沒上鎖。這就是可以確保剛好 4 個抽屜是安全的的六個組合。安全的抽屜以粗體字母來表示。
輸入說明 :
輸入檔最多有 5000 行的輸入。
每行有兩個整數 n 及 s (1 ≤ n ≤ 65 且 0 ≤ s ≤ 65)。其中 n 是共有幾個抽屜,s 是要確保安全的抽屜數量。
輸入以含有兩個負數的一行作為結束。請不要處理這行輸入。
輸出說明 :
相對於每行的輸入要產生一行輸出。這行要含有一個表示有幾個方法可以確保 n 個抽屜中剛好有 s 個抽屜是安全的。
範例輸入 :
6 2
6 3
6 4
-1 -1
範例輸出 :
16
9
6
提示 :
DP
感谢morris1028补上图片!
出處 :
UVa ACM 11420 (管理:snail)
解題策略
使用DP,
有i個櫃子,確定j個櫃子是安全的,且最上一層是上鎖的,
加上有i-1個櫃子,確定j-1個櫃子是安全的,且最上一層是上鎖的,
加上有i-1個櫃子,確定j-1個櫃子是安全的,且最上一層是沒有鎖的,
num[i][j][1]+=num[i-1][j-1][0]+num[i-1][j-1][1];
有i個櫃子,確定j個櫃子是安全的,且最上一層是沒有鎖的,
加上有i-1個櫃子,確定j+1個櫃子是安全的,且最上一層是上鎖的,
加上有i-1個櫃子,確定j個櫃子是安全的,且最上一層是沒有鎖的,
num[i][j][0]+=num[i-1][j+1][1]+num[i-1][j][0];