SDOI2010 地精部落 DP 組合

2022-03-16 15:57:57 字數 1099 閱讀 8037

一句話題意

給定1到n求其全排列中沒有三個及以上遞增(減)的方案數,ans%p(p不一定為素數)

錯誤打法一

我看到這道題後首先想到的是容斥:

ans=全排列-至少3個不滿足的+至少4個......

但是考慮不到有兩個不連續的遞增(減)的情況,所以wa0了。

錯誤打法二

f[i][0]代表前i個已經處理好了且下乙個該是山谷的方案,1同理。

假如有乙個這樣的數列(i=8)

3 2 7 4  5 6 1

j       

4 5 6不滿足條件,所以要把8往4 5之間放,所以便有

f[i][(i-j-1)&1]+=f[j][1]*f[i-j-1][(i-j-1)&1];

但是我們會發現我們不能考慮到i放的地方前乙個和後乙個的大小所以這個又崩了......

正解

其實不用考慮往中間插,只要考慮往末尾放就行,即:

f[i][k&1]+=f[j][1]*f[k][k&1];(k=i-j-1)

呃...樣例又沒過。哦哦,忘記考慮i-1個元素的排列了。

最終式子:

f[i][k&1]+=c[i-1][j]*f[j][1]*f[k][k&1];(k=i-j-1)

因為p不保證是質數,所以組合用楊輝三角遞推即可。

#include#include

#define ll long long

using

namespace

std;

ll ans,n,p,f[

5000][2],a[5000][5000

];int

main()}f[

0][0]=f[0][1]=f[1][1]=f[1][0]=1

;

for(int i=2;i<=n;i++)

}ans=(f[n][1]+f[n][0])%p;

printf(

"%lld

",ans);

return0;

}

view code

SDOI2010 地精部落

求1 n的全排列數目,使得對於 i geq 3 a a 的大小關係與 a a 的大小關係不同 題目還有另外一種格式 求一種全排列,使得這個排列要麼滿足奇數項的高度比相鄰位置都大,要麼滿足偶數項的高度比相鄰位置都大.設 dp 表示用了前 i 個數字,a 1 j 且 a 1 a 2 時的方案數 有乙個神...

SDOI2010 地精部落

這道題是一道 dp 題,思維難度比較大。題意 先定義波形陣列 滿足當 i 全為奇數或偶數時,a i a i 1 且 a i a i 1 求 n 的全排列中有多少個符合波形陣列。我們記錄狀態為 f i j 0 1 i 為剩下 i 個數,j 表示有 j 1 個數小於剛剛選擇的數,當第 3 個下標為 0 ...

SDOI2010 地精部落

sdoi2010 地精部落 僅含一行,兩個正整數 n,p。僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。4 7對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿足 n 550 對於 100 的資料,滿足 3 n 4200,p 109 我覺得...