將字母a-z編碼,a為1,b為2,……依此類推,z為26;則abc編碼為123。但是反向解碼時,解碼結果不唯一,比如123可以解碼為1-2-3:abc,解碼為12-3:lc,解碼為1-23:aw(注意,127不能解碼為1-27,因為範圍只能為1-26)。
現給出一組編碼後的數字串,讓你求該數字串可以有幾種解碼方式(上例中,123對應著3種解碼方式)。問題輸入將保證其為乙個合法的數字串。比如100是乙個不合法的數字串,因為0或者00不代表乙個字母;此外01不能視為1。
sample input
25114
1111111111
3333333333
sample output689
1【解題思路】
演算法設計與分析上剛學了分治法,就想拿來試試手,就找了這題。
一開始覺得這題應該用搜尋,但超時。後改用分治,遞迴。以25114為例:
25114共有幾種解碼方式,可以取決於它的字首解碼方式數*字尾解碼方式數。
也就是num(25114)=(num(251)*num(14 ) (每次都從中間開始分段);如果251有3種解碼方式,14有2種解碼方式,則25114有2*3=6種解碼方式。然後依次遞迴下去。
但是別忘了,25114從25|114出分開,而中間的子串「51」本身是否是乙個編碼,而不應該只算分開時的num(當然本例中51本身不是編碼)。比如22114,22|114如果按照上述演算法共有2*3=6種解碼方式,但是子串「21」本身可以作為一種編碼,那麼22114的遞迴式就該加上這種考慮,變形為:
num(22114)=num(221)*num(14)+num(22)*1*num(4)---;其中1代表「11」子串。
除了這點考慮,別忘了裡面含0的情況,要知道「02」不能代表「2」;所以一般裡面有0的情況,0一般只能和前面那個數字組成合法的編碼(題目保證0前面必須是1或者2,組成10和20)。
所以在考慮**分段的那個子串時(比如25114中,「51」是**子串;123456中「34」是**子串),就得考慮含0的情況。比如1010這個例子中,**子串「01」第乙個字元為0,則它的遞迴式和等同。如果在111012這個例子裡,**子串變為「10」,其中第二個字元為0,則其遞迴式為num(111010)=num(11)*1*num(12)---。
發現好久沒有做題了,習慣都丟了,首先陣列定義的要足夠大,已經主函式裡,還是要加上返回型別的return 0;(養成良好的習慣)
百煉:陣列定義不夠大)
北京大學acm:返回值很重要)
#includeint num(char a,int start,int end)
else }
int main()
return 0;
}
曼徹斯特編碼 差分曼徹斯特編碼
1 曼徹斯特編碼 manchester encoding 位中間電平從低到高跳變表示 0 位中間電平從高到低跳變表示 1 2 差分曼徹斯特編碼 differential manchester encoding 在最初訊號的時候,即第乙個訊號時 如果中間位電平從低到高,則表示0 如果中間位電平從高到低...
自編碼與變分自編碼
神經網路的本質是資訊壓縮特徵提取,神經網路公式h w x 做內積,所以神經網路是個相關性判斷 研究ai頂級公司研究損失。無監督學習是在沒有資料標籤的情況下,尋找資料特徵。但是無監督學習的標籤是自身,自監督學習,是無監督學習的一種特殊情況,他是將資料切分n塊,然後用各個塊來 其他塊。弱監督學習,是將無...
分字 漢字編碼
關於使用gbk和utf8進行漢字編碼的學習總結。gbk編碼規則簡述 列表如下 1位元組字元 ascii字元 2位元組字元 漢字 0 x 1 x xx 其中 x 代表0或1。utf8編碼規則簡述 注意漢字的編碼前面至少有2個1 有幾個1就表示該漢字用幾個位元組表示 列表如下 1位元組字元 ascii字...