bzoj1925 SDOI2010 地精部落

2022-04-29 22:24:12 字數 729 閱讀 2845

問1到n的排列中有多少個是"抖動"的.即:滿足所有奇數字置的數字都比相鄰兩個數字小或者都比相鄰兩個數字大.

定義f[i][j]表示長度為i,第乙個元素為j,且第乙個元素大於第二個元素的所有排列中,"抖動排列"的數目.g[i][j]表示長度為i,第乙個元素為j,且第乙個元素小於第二個元素的所有排列中,"抖動排列"的數目.

考慮長度為i,第乙個元素為j,且第乙個元素大於第二個元素的乙個排列,我們刪掉它的第乙個元素,然後把其他所有大於i的元素都減1,可以得到乙個1到i-1的排列,這個排列是第乙個元素小於第二個元素的.我們列舉刪掉第乙個元素之後的新排列的第乙個元素的大小,發現f[i][j]可以從g[i-1][1,2,3...(j-1)]轉移過來.g[i][j]的求法類似.

dp方程如下:

\(f[i][j]=g[i-1][1]+g[i-1][2]+g[i-1][3]+...+g[i-1][j-1]

\)\(

g[i][j]=f[i-1][j]+f[i-1][j+1]+...+f[i-1][i-1]

\)字首和優化一波即可.

#includeint mod;

int f[2][5005],g[2][5005];

int main()

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

} printf("%d\n",(f[flag][n]+g[flag][n])%mod);

return 0;

}

bzoj1925 Sdoi2010 地精部落

題目大意 求全排列中鋸齒狀排列的個數。首先進行打表暴力,會發現第乙個元素作為山峰和第乙個元素作為山谷,這兩種方案數是相等的,因此我們只需求出第乙個元素是山谷的方案數再乘2就是答案。做法一 f i 表示i的全排列,第乙個元素時山谷時,鋸齒狀排列的方案數。那麼考慮在i 1的乙個鋸齒狀排列中插入i這個數,...

bzoj1925 Sdoi2010 地精部落

傳送門 我們設f i j 表示前i個數,第i個數排名是j的方案總數。我們可以強制第1個數是山峰。然後我們可以將整個序列高度取反,得到其他的方案數。然後我們發現這樣做的時間複雜度是o n 3 的 加上字首和優化就是o n 2 了 var f array 0.1,0.5005 of longint n,...

bzoj1925 Sdoi2010 地精部落

傳說很久以前,大地上居住著一種神秘的生物 地精。地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為n的山脈h可分為從左到右的n段,每段有乙個獨一無二的高度hi,其中hi是1到n之間的正整數。如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是乙個山峰。位於邊緣的山脈只有一段相鄰的山脈,其他都有兩段 即...