UVa - 10721 解題紀錄
題目說明
組成 bar 的單位為長方條 ( units ),units 的顏色可以是黑色也可以是白色,同一種顏色排在一起視為一個 bar。
BC(n, k, m)
表總共使用 n
個 units,組成 k
個 bar,每個 bar 的寬度不可超過 m
個 units,且第一個 bar 為黑色,能組出的所有情況數
給 n
、k
、m
,求 BC(n, k, m)
。
Input: 每組測資有三個整數,依序為 n
、k
、m
。
Output: 輸出 BC(n, k, m)
。
解題思路
動態規劃題,由於測資範圍不大,因此先算出所有情況的答案再輸出即可。
定義 dp[n][k][m]
表 BC(n, k, m)
,先設定初始狀態,由於第一個 bar 必為黑色,因此可以知道,dp[n][1][m] = 1,對於所有 m >= n,也就是只能是黑色的 bar,而 m >= n
是因為當 m < n
時無法使用完 n
個 units,因此為 0。
對於 dp[n][k][m]
:
- 若
m > n
,dp[n][k][m] = dp[n][k][n] 。因為最多只可使用n
個 units。 - 若
m <= n
,dp[n][k][m] = dp[n - 1][k - 1][m] + dp[n - 2][k - 1][m] + … + dp[n - m][k - 1][m] 。
可以想像為,在原本的組合下接上新的 bar,如dp[n - 1][k - 1][m]
為接上一個 unit 的 bar 後的情況數,dp[n - 2][k - 1][m]
為接上兩個 units 的 bar 後的情況數,…,最多只可接上m
個 units 的 bar。而新接上的 bar 的顏色必定與原本最後一個 bar 的顏色相反,由於只有黑白兩色,因此計算時不需考慮顏色。
參考解法
1 |
|
參考資料
[UVA] 10721 - Bar Codes | 水泥城式
UVa/UVa 10721 - Bar Codes.cpp at master · ajahuang/UVa
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Larry's notes!
評論