每日演算法 計數DP和遞推DP

2021-10-06 09:59:05 字數 2865 閱讀 4364

計數pd就是emm感覺求那種什麼路徑和的就是計數那一類的,再概括一下就是可以不用其他操作直接將它相鄰或者說符合要求的**求和,就是下乙個位置的值。

回到這題:

用動規很好做。

我們想要知道(0,0)到終點的位置的路徑,只需要知道終點已左終點已下的路徑為多少就行了。

dp[i][j]:(0,0)到(i,j)位置的路徑和。

轉移方程:dp[i][j] = dp[i-1][j]+dp[i][j-1];

初始化,將第一行第一列全初始化為1.

狀態壓縮:由於每次都是使用的左和上方的值,那麼我們可以將陣列壓縮為一維。

class

solution

}return dp[n-1];}}

用遞迴+備忘錄的寫法:

遞迴可讀性是真的強,要想知道到m,n點的路徑和,那麼我們就得知道m-1,n和m,n-1的路徑和。然後找到結束條件,我們知道第一行第一列肯定都是只有1種的,這樣結束條件也找到了,為了避免重複計算,我們再使用乙個備忘錄儲存已經計算過的值。

這題與上題的區別在於多了障礙,因為無法停留於障礙點,所以障礙點的路徑和為0.不過初始化時需要注意,第1行和第1列如果中間有障礙,那障礙之後的都不可達。

其實看到二叉樹的題就想用dfs,備忘錄就用來記錄子樹的種類。

二叉搜尋樹,就是需要左子樹小於根,根小於右子樹。

假設元素只有0個,則只有1種可能

假設元素只有1個,則只有1種可能

假設元素只有2個,則只有11+11種可能

假設元素只有3個,則只有12+11+12種可能

假設元素只有4個,則只有種1 x(1 x元素為3可能)+1x(元素為1x元素為2)+1x(元素為1x元素為2)+1 x(元素為31)可能

如果元素為n,則有(1x元素n-1)+(元素為n-2x元素為1)…(元素為n/22)+…+(元素為n-1x1);

dp陣列就為dp[i]元素數量為i時的種類數.

這個不就是把規則改為了前三個數之和嘛

這題被劃分為遞推dp,倒也不用多解釋,感覺就跟數學裡學那種遞推式差不多。之前做那個**跳樓題就是對這種題拓展情況

!!!!這個不是那個馬過河還是啥子題的感覺嘛

按下n個數字可以等價為跳n-1次

想要知道跳n-1次可能的組成情況,那麼就需要知道跳n-2次情況。由於起始點不同所以永遠不會有重複的情況,而且數字5永遠其他點跳不到也5也跳不出去,僅能作為長度為1時的起始位置。

畫一下圖大概知道各個狀態的轉移方式,請將所有的單箭頭想成雙向箭頭。

看圖可知,根據狀態可轉移的路徑數和可轉移到的路徑位置,可分為4種狀態:

無論哪個狀態無非就是在這些狀態間轉換,可以轉換的路徑數,即為當前可能.

狀態可由 2個方向轉換得來

狀態可由+*2

可由+可由*2

那兩個方向如何理解呢?

比如狀態

當狀態想轉移到4狀態時,兩個方向都是被允許的,所以有兩個方向。

求得所有的狀態數之後,再將對應狀態的數字數量x狀態數即可。

class

solution

long ans =

(dp[0]

+(dp[1]

<<1)

%mod+

(dp[2]

<<2)

%mod+

(dp[3]

<<1)

%mod)

%mod;

return

(int

)ans;

}}

遞推DP 加深

zoj 3747 題意 給n個士兵排隊,每個士兵三種g r p可選,求至少有m個連續g士兵,最多有k個連續r士兵的排列的種數。都轉化為至多的士兵連續的個數。令集合a 集合b c a b 在轉化要如何求 至多x個g士兵連續,至多y個士兵連續 dp i 0 至多i個g 的方案數 dp i 1 至多i個r...

計數dp小結

序 除了剛開始的看了幾道題的題解,後來也自己肛出了幾道 剩下不可做的題不也沒做嗎 這些題目最大的特點是在於需要自己構造狀態,這往往會成為一道題的最大卡點 窮舉表示水不到幾分 題目選講 e 如果直接模擬,複雜度為k n2既然每一步只能往上下或往左右走,那麼我們可以把題目分解為在x軸上行走k步與在y軸上...

計數DP 種樹

題目描述 事實上,小x邀請兩位奆老來的目的遠不止是玩鬥地主,主要是為了抓來苦力,替他的後花園種樹 小x的後花園是環形的,他想在花園周圍均勻地種上n棵樹,但是奆老花園的土壤當然非同尋常,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。小x最喜歡3種樹,這3種樹的高度分別...