BZOJ1925 SDOI2010 地精部落

2022-05-25 03:03:07 字數 671 閱讀 6888

做之前:什麼鬼題目...

做之後:一道妙極了的dp

首先我們發現第乙個數是山峰和第乙個數是山谷的個數是一樣的------①

在乙個波動數列中,若兩個數字 i 與 i+1 不相鄰,那麼我們直接交換這兩個數字就可以組成乙個新的波動數列------②

由①深入思考:把乙個波動序列的每一項$a_$變為n+1-$a_$就會得到與當前序列波動性相反的乙個數列------③

比如:1 3 2----->3 1 2

所以我們只用考慮一種情況,最後把ans*2

假設dp[i][j]表示用前i個數組成的序列且第乙個數是j

由②有j與j+1不相鄰時:dp[i][j]=dp[i][j-1]

由③有j與j+1相鄰是:dp[i][j]=dp[i-1][i-(j-1)];

然後總數加起來即可

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 inline int

read()

9while(isdigit(chr))

10return ans*f;

11 }int n,ha,dp[2][4201

],ans;

12int

main()

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