著色方案(記憶化搜尋)

2021-10-08 21:53:09 字數 1114 閱讀 7506

傳送門

有n個木塊排成一行,從左到右依次編號為1~n。

你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。 所有油漆剛好足夠塗滿所有木塊,即c1+c2+…+ck=n。

相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。

輸入描述:

第一行為乙個正整數k,第二行包含k個整數c1, c2, … , ck。

輸出描述:

輸出乙個整數,即方案總數模1,000,000,007的結果。

示例1輸入複製3

1 2 3

輸出複製

101<=k<=15 ,1<= ci <=5

思路:首先由資料範圍我們可以發現最多只有5種顏色,且每種顏色使用次數也很小,所以我們可以採用六維度陣列dp[a][b][c][d][e][pre]表示,有a種可以用1次的顏色,b種可以用2次的顏色,c種可以用3次的顏色,d種可以用四次的顏色,e種可以用五次的顏色,在前一次為用可以pre次的顏色情況下符合條件的情況。

注意:必須用新增pre這維不然,情況會錯誤,當pre為某個的時候為0,其他情況為會計算為0;

#include

using

namespace std;

typedef

long

long ll;

ll dp[17]

[17][

17][17

][17]

[6];

ll mod=

1e9+7;

int n,a[6]

;ll dfs

(int a,

int b,

int c,

int d,

int e,

int pre)

intmain()

memset

(dp,-1

,sizeof

(dp));

for(

int i=

0;i<=

5;i++

) cout<<

dfs(a[1]

,a[2

],a[3]

,a[4

],a[5]

,0)<}

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...