bzoj1925 SDOI2010 地精部落

2022-05-16 01:49:50 字數 1074 閱讀 8304

題目鏈結

\(f(i,j)\)表示長度為i,由1~i構成且結尾數字為j,結尾為'v'形狀的序列方案數。

\(g(i,j)\)表示長度為i,由1~i構成且結尾數字為j,結尾為'^'形狀的序列方案數。

轉移比較明顯,就是結尾選了j的話那麼就把1 ~ j-1 及 j+1 ~ i 對映到 1 ~ i-1 ,根據形狀判斷上一位的大小轉移。

\[g(i,j)=\sum_f(i-1,k-1)

\]\[f(i,j)=\sum_\)及\(g_\)的字首和來優化,還有開滾動陣列。

#include#include#include#include#include#include#include#define p puts("lala")

#define cp cerr<<"lala"<'9')

while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();

return re*g;

}typedef long long ll;

typedef pairpii;

const int n=4250;

int f[n],g[n],sf[n],sg[n];

int n,mod;

int main()

else if(n==2)

else if(n==3)

f[2]=1; f[3]=1; g[1]=1; g[2]=1;

for(int j=1;j<=3;++j) sf[j]=(sf[j-1]+f[j])%mod,sg[j]=(sg[j-1]+g[j])%mod;

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

for(int j=1;j<=i;++j) sf[j]=(sf[j-1]+f[j])%mod,sg[j]=(sg[j-1]+g[j])%mod;

} int ans=0;

for(int i=1;i<=n;++i) ans=(ans+f[i])%mod,ans=(ans+g[i])%mod;

printf("%d\n",ans);

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之間的正整數。如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是乙個山峰。位於邊緣的山脈只有一段相鄰的山脈,其他都有兩段 即...