有n個木塊排成一行,從左到右依次編號為1~n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊,即c1+c2+…+ck=n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。
第一行為乙個正整數k,第二行包含k個整數c1, c2, … , ck。
輸出乙個整數,即方案總數模1,000,000,007的結果。
3
1 2 3
10
100%的資料滿足:1 <= k <= 15, 1 <= ci <= 5
這道題有點玄學,不管了,開始我也沒想到要這麼做,講一下大概做法吧.我們設f[a][b][c][d][e][last]為剩餘塗色次數為1.2.3…5次的顏色數,last表示上次塗了剩餘顏色數為last的顏色,舉個例子,f[1][2][3][4][5][2]表示當前有1個顏色可以塗一次,兩個顏色可以塗兩次…上次塗的顏色是剩餘塗色次數為2的顏色中的乙個.那麼我們可以想到這個狀態可以由f[0][3][4][5][x]轉移過來,那麼我們就想到了可以dp了,由於對於剩餘塗色次數為x的顏色,它們的性質是一樣的,我們把它們加起來就可以了.於是我們可以打記憶化了.
**如下
#include
#include
using
namespace
std;
typedef
long
long ll;
static
const
int maxm=15+1;
static
const
int mod=1e9+7;
ll f[maxm][maxm][maxm][maxm][maxm][maxm];
int cnt[maxm];
int n,x;
ll dfs(int a,int b,int c,int d,int e,int last)
int main()
點我進入ac通道 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,...
bzoj1079 SCOI2008 著色方案
有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊,即c1 c2 ck n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。第一行為乙個正整數k,第二行包含k個整數c1,c2,ck。輸...