給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的……
有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。
k<=15,ci<=6,資料組數<=2000
這種題一般很難有直接的通式,可以考慮dp。
設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。(這裡的空指的是每兩個球中間的位置,包括開頭結尾,不合法即指兩邊的球的顏色相同)
我們再列舉乙個p和q,表示這種顏色要放到p個合法空和q個不合法空。
那麼新的j呢?
因為我們放入了q個不合法空,所以j會減去q,然後,總共有c[i+1]個球,在p+q個空中各放了乙個後,剩下的無論怎麼放都會產生乙個不合法空,所以加上c[i+1]-p-q
即:f[i,j]->f[i+1,j+c[i+1]-p-q]
然後如何轉移,首先,我們要把c[i+1]個球放到p+q個空中,每個空都必須要放,所以有cp
+q−1
c[i+
1]−1
種方法放,然後,在現有的j個空中選q個,乘上cq
j ,設總共有sum個空,再乘上cp
sum−
j 。
然後這道題就解決了。
ps:由於比賽時特別方,我瘋狂滴優化常數,打得非常的渣渣。
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define mo 1000000007
#define n 105
using namespace std;
typedef long long ll;
int n,ty,x,c[n][n],f[20][n];
int min(int
x,int
y) int get()
int main()
} for(ty=get();ty;ty--) sum+=x;
}printf("%d\n",f[n][0]);
}}
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOI(P)2013模擬 秘密任務
這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...
jzoj3424 NOIP2013模擬 粉刷匠
description input 第一行乙個正整數t,表示測試資料組數 對於每一組測試資料資料 第1行 乙個正整數k 第2行 k個正整數,表示第i桶油漆可以粉刷的石柱個數,ci。output 對於每組輸入資料,輸出一行乙個整數,表示粉刷的方案數mod 1000000007。sample input...