1079 SCOI2008 著色方案

2021-07-17 01:23:57 字數 1535 閱讀 9820

time limit: 10 sec  

memory limit: 162 mb

submit: 1617  

solved: 985 [

submit][

status][

discuss]

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

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

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

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

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

31 2 3

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

[submit][

status][

discuss]

f[a][b][c][d][e][last]:還剩下a瓶可以塗乙個格仔的顏料,b瓶可以塗兩個格仔的顏料...上一次是用了一瓶可以塗   last個格仔的顏料,方案數

轉移顯然,可以用記憶化搜尋

然後,記得用vis陣列來判斷有沒有訪問過,貌似有些f數模1e9+7剛剛好是0

t了好幾發。。gg

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const ll mo = 1000000007;

int n,tot,tot[6],max[6],f[17][17][17][17][17][6];

bool vis[17][17][17][17][17][6];

int dfs(int a,int b,int c,int d,int e,int last)

else if (last == 2)

else if (last == 3)

else if (last == 4)

else if (last == 5)

return f[a][b][c][d][e][last] = f;

}int main()

for (int i = 1; i <= 5; i++)

f[tot[1]][tot[2]][tot[3]][tot[4]][tot[5]][0] = 1;

vis[tot[1]][tot[2]][tot[3]][tot[4]][tot[5]][0] = 1;

cout << dfs(0,0,0,0,0,1);

return 0;

}

1079 SCOI2008 著色方案

有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊,即c1 c2 ck n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩 個相鄰木塊顏色不同的著色方案。第一行為乙個正整數k,第二行包含k個整數c1,c2,ck。...

BZOJ 1079 SCOI2008 著色方案

題目 分析 一看就覺得是dp或者直接排列組合公式或者容斥?我就只想到dp的,我們用dp i j 表示前i種顏色,排列出有j對相鄰一樣顏色的方案數。當出現乙個新的顏色時,我們把這個顏色插板法插進去,我們要列舉插入的方式,可能插到相鄰顏色一樣的中間,或者不是,然後進行狀態轉移.具體看 include i...

BZOJ1079 SCOI2008著色方案 DP

只能想到 5 15 的方法。我們要利用起 ci比較小這個性質,f a b c d e last 表示有a 種顏色用了1個,b種顏色用了2個 上一次染色用的是剩餘 last 個的顏色,轉移就是f a,b,c,d,e,last a last 2 f a 1,b,c,d,e b last 3 f a 1,...