SCOI2008 著色方案 (狀態壓縮)

2021-09-10 17:14:36 字數 1093 閱讀 6779

題目鏈結

description

有n個木塊排成一行,從左到右依次編號為1~n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。

所有油漆剛好足夠塗滿所有木塊,即c1+c2+…+ck=n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩

個相鄰木塊顏色不同的著色方案。

input

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

output

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

sample input

31 2 3

sample output

10hint

100%的資料滿足:1 <= k <= 15, 1 <= ci <= 5

解題思路:

首先,這顯然是一道dp題目,然後開始考慮dp狀態的設定。

對於每個位置的選擇,我們需要知道:一,到當前位置時顏色的剩餘狀態。二,前乙個位置塗得顏色。

顏色的剩餘狀態假如強行記錄的話,共有15種顏色,每種顏色有5次填塗,狀態數總共是5^15。

我們發現,並不一定確切的知道每一種顏色的剩餘狀態,可以通過將顏色歸類,來減少狀態數,這裡需要保證的是同類顏色的處理和對答案的影響完全一致。

可以通過顏色的剩餘填塗次數,將所有顏色分為5類,分別對應剩餘1次、2次、3次、4次、5次。每一類的容量最大為15,狀態數為15^5。

狀態轉移過程不再分析。

#include #define ll long long

using namespace std;

const int mod = 1e9+7;

ll dp[16][16][16][16][16][6];

int num[6];

ll dfs(int a,int b,int c,int d,int e,int prev)

dp[a][b][c][d][e][prev] = ans;

return ans;

}int main()

memset(dp,-1,sizeof(dp));

cout

}

SCOI2008 著色方案

time limit 10 sec memory limit 162 mb submit 2228 solved 1353 submit status discuss 有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊...

SCOI2008 著色方案

給你 k 種顏料,每種顏料有 c 份,每份顏料塗一塊木板,求恰好用完所有顏料且相鄰兩木板顏色不同的塗色方案種數.1 leq k leq 15 1 leq c leq 5 由於此題資料較小,考慮dp套組合數學,但重複dp運算量極大,考慮記憶化搜尋優化.又因為每種顏料至多5份,模擬烏龜棋,我們可以開乙個...

SCOI2008 著色方案 高維dp

輸入檔案 color.in輸出檔案 color.out簡單對比 時間限制 1 s 記憶體限制 64 mb 題目背景 有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i 種顏色的油漆足夠塗ci 個木塊。所有油漆剛好足夠塗滿所有木塊,即 c1 c2 ck n。相鄰兩個木塊塗相同色...