DP 求方法數 加法 乘法原理

2021-10-06 02:31:52 字數 1543 閱讀 5944

先用乙個簡單的例子(70),來說明這個類別的特點。

一共n階樓梯,每次可以爬1階或2階,求一共多少種方案

這種求總方案的,很容易想到用dp。

dp[i]定義為:爬到第i階的總方案數

想小學學過的加法原理和乘法原理:

加法原理:從武漢到上海有乘火車、飛機、輪船3種交通方式可供選擇,而火車、飛機、輪船分別有k1,k2,k3個班次,那麼從武漢到上海共有 k1+k2+k3種方式可以到達。

對應本題:第i階可以從i-1階來,或者i-2階來,兩者的方案數要相加

乘法原理:做一件事,完成它需要分成n個步驟,做第一 步有m1種不同的方法,做第二步有m2種不同的方法,……,做第n步有mn種不同的方法。那麼完成這件事共有 n=m1×m2×m3×…×mn 種不同的方法。

對應本題:「我們最終來到第i階」

步驟1:到達第i-1階,方法數:dp[i-1]

步驟2:從第i-1階到第i階,方法數:1

於是總方法數:dp[i-1] * 1

把加法乘法原理結合一下,就得到:

dp[i] = dp[i-1] * 1 + dp[i-2] * 1

注意!採用加法原理的這兩種方法是互斥的!(即「到達第i-1階」和「到達第i-2階」兩個事件互斥,不會同時發生)

class

solution

return ways;

}}

解碼表: 『a』 -> 1, 『b』 -> 2 ,…, 『z』 -> 26

input: 「226」,求解碼方法數 output: 3

explanation: it could be decoded as 「bz」 (2 26), 「vf」 (22 6), or 「bbf」 (2 2 6).

解碼解到當前位i,可能兩種情況(互斥事件):

情況1:步驟1:從頭到第i-1位已經解碼好;步驟2:解第i位單獨的

情況2:步驟1:從頭到第i-2位已經解碼好;步驟2:解第i 和 i-1兩位的組合

具體的,「解第i 和 i-1兩位的組合」的方法數,可能是1或0,在10到26之間就是1,不在就是0。「解第i位單獨的」類似,0至9之間是1,否則是0。

class

solution

int n = s.

length()

;int

dp =

newint

[n+1];

dp[0]

=1; dp[1]

= s.

charat(0

)!='0'?1:

0;for(

int i =

2; i <= n; i++)if

(two >=

10&& two <=26)

}return dp[n];}

}

還有別的,但暫時先寫這倆哈,之後慢慢補哈哈。

加法原理和乘法原理

設事件a有m種產生方式,事件b有n種產生方式,則當a和b的產生方式不重疊時,事件a或b之一 有m n種產生方式。可推廣多個事件 設事件a有m種產生方式,事件b有n種產生方式,則當a和b的產生方式彼此獨立時,事件a與b有m n種產生方式。無論事件a採用何種方式產生,都不影響事件b。可推廣多個事件 例1...

求乘法數值和符號

有等式 i j3 k 2 8hm9 處為 四個運算子之一,現滴上了墨水無法辨認。請程式設計找出字母表示哪個數字,表示哪個運算子。includeusing namespace std i j3 k 2 8hm9要計算的式子。int calculate int s,int num1,int num2 計...

Python實現矩陣加法和乘法的方法分析

本來以為python的矩陣用list表示出來應該很簡單可以搞。其實發現有大學問。這裡貼出我寫的特別不pythonic的矩陣加法,作為反例。def add a,b rows len a 0 cols len a c for i in range rows temp for j in range col...