記一道DP題

2021-10-23 17:17:59 字數 1831 閱讀 3092

給定 n l r

求長度為n的 且元素在 [l-r] 的 且 陣列元素和是3的倍數的 陣列的 個數

dpmod0 表示區間內的數mod 3 = 0的個數 mod1 mod2 同理

dp[i][j] 表示 長度為i的 陣列元素mod 3 為 j 的陣列的個數

如果 i-1長度的陣列和 mod 3 = 0 那麼我再加乙個 mod 3 = 0的數 整個陣列 mod 3 還是等於0

如果 i-1長度的陣列和 mod 3 = 1 那麼我再加乙個 mod 3 = 2 的數 整個陣列 mod 3 就等於0了

如果 i-1長度的陣列和 mod 3 = 2 那麼我再加乙個 mod 3 =1 的數 整個陣列 mod 3 就等於0了

也就是 dp[i][0] = dp[i-1][0]*mod0+dp[i-1][1]*mod2+dp[i-1][2]*mod1

剩下兩個同理

那麼轉移方程:

dp[i][0] = ((dp[i-1][0]*mod0)%mod+(dp[i-1][1]*mod2)%mod+(dp[i-1][2]*mod1)%mod)%mod

dp[i][1] = ((dp[i-1][0]*mod1)%mod+(dp[i-1][1]*mod0)%mod+(dp[i-1][2]*mod2)%mod)%mod

dp[i][2] = ((dp[i-1][0]*mod2)%mod+(dp[i-1][1]*mod1)%mod+(dp[i-1][2]*mod0)%mod)%mod

n,l,r =

map(

int,

input()

.split())

dp =[[

0,0,

0]for i in

range

(n)]

mod =

1000000007

mod0 =

(r//3-

(l-1)//

3)%mod

mod1 =

((r+2)

//3-(l+1)

//3)%mod

mod2 =

((r+1)

//3-(l)//3

)%mod

dp[0][

0]= mod0

dp[0][

1]= mod1

dp[0][

2]= mod2

print

(mod1,mod2,mod0)

for i in

range(1

,n):

dp[i][0

]=((dp[i-1]

[0]*mod0)

%mod+

(dp[i-1]

[1]*mod2)

%mod+

(dp[i-1]

[2]*mod1)

%mod)

%mod

dp[i][1

]=((dp[i-1]

[0]*mod1)

%mod+

(dp[i-1]

[1]*mod0)

%mod+

(dp[i-1]

[2]*mod2)

%mod)

%mod

dp[i][2

]=((dp[i-1]

[0]*mod2)

%mod+

(dp[i-1]

[1]*mod1)

%mod+

(dp[i-1]

[2]*mod0)

%mod)

%mod

print

(dp[n-1]

[0])

記一道模擬題

今天也沒幹啥,長時間不運動,身體似乎倍感不適,宿舍一天到晚也沒有陽光照進來,實在是讓人難受,我那幾雙臭鞋也越發那啥了.趁著還有點時間,寫了一道模擬題,總是有愛看題解的臭毛病,今天終於忍住沒看,自己寫出來了。還是挺高興的。是洛谷原創的題目,題目背景是我的世界,計算乙個 n n的方塊中會出現多少怪物。想...

一道簡單DP題

首先,一看就應該知道這是一道dp題。原因在於其當前結果都依賴於前面計算得到的子結果。區分分治和dp的關鍵條件就在於演算法執行中間階段的計算結果是否依賴於其子問題的結果,若依賴則為dp,否則為分治。dp題的關鍵在於找出狀態轉移方程和初始條件 或者稱為邊界值 找出狀態轉移方程的關鍵又在於找對乙個狀態函式...

DP 一道遞推題。。。

bob想要構造一張由n個節點構成的圖。構造的過程由兩步組成 首先bob會取出n個孤立的點,並把它們從1到n編號,然後對每個節點用一種顏色染色,bob一共可以使用k種不同的顏色。接下來bob會在這張圖中加入一些有向邊,對於每乙個編號範圍在 2,n 的節點i,bob有可能選擇乙個節點j滿足j i並且節點...