切換
舊版
前往
大廳
主題

ZeroJudge - b593: Code 解題心得

Not In My Back Yard | 2019-02-25 23:34:42 | 巴幣 0 | 人氣 843

題目連結:


題目大意:
定義一種編碼,其為英文的26個字母組成。對於每一組相鄰的字母,左邊的字母之字典序會小於右邊的字母的字典序。因此,我們可以定義為以下:
a=1
b=2
……
z=26
ab=27
……
az=51
bc=52
……
vwxyz=83681

現給定一字串(長度不會超過 26 字元),先檢查是否為合法的編碼(例如 abb 就是一組不合法的例子)。如果不合法,就輸出「0」;反之,輸出其相對應的編號。



範例輸入:
bf
abca
vwxyz
0


範例輸出:
55
0
83681


解題思維:
我們觀察一編碼為 bdfg :
因為前面已經經過了長度為 1 、 2 、 3 的編碼,所以我們可以得知其編號至少為
C26取1 + C26取2 + C26取3
且長度為 4 , a 開頭的經歷過了,所以還要加上
C25取3
接著是 bc 開頭的,要加上
C23取2
接著是 bde 開頭的,也要加上
C21取1
最後,再加上 bdfg 本身為 1。所以其編號為 5526 。



而取東西的方法數可以用 DP(動態規劃)得出,參見這位大大的文章

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

風知名
我以為DP是要把Combination(M,N)建表,但看遞迴式又跟C幾取幾有差一點點
所以我看不懂那邊DP建的表是什麼的表
2020-12-01 19:50:02
風知名
舉例來說c(m,n) = c(m-1,n)+c(m-1,n-1)
但dp那邊建的表是f(m,n) = f(m-1,n)+f(m,n-1)
2020-12-01 19:58:52
Not In My Back Yard
DP 那邊建的表是巴斯卡三角形,因為巴斯卡三角形跟排列組合有一定的等價性。

該三角形第 N 列(列數從 0 開始)第 K 個元素,即對應 C N 取 K。
2020-12-01 20:27:26
Not In My Back Yard
更正,程式碼裡面寫得好像不太一樣,總之該陣列 DP[M][N] 代表的是 C (M + N) 取 N 的意思
2020-12-01 20:35:59
風知名
非常感謝你,雖然後來我發現我無法AC是其他原因
不過又學到了利用巴斯卡三角建排列表,感覺很厲害的方法
2020-12-01 21:00:43

更多創作