1. 程式人生 > >P2467 [SDOI2010]地精部落

P2467 [SDOI2010]地精部落

return 兩個 fin ace color -m 得到 max 一行

題目描述

傳說很久以前,大地上居住著一種神秘的生物:地精。

地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為N的山脈H可分為從左到右的N段,每段有一個獨一無二的高度Hi,其中Hi是1到N之間的正整數。

如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是一個山峰。位於邊緣的山脈只有一段相鄰的山脈,其他都有兩段(即左邊和右邊)。

類似地,如果一段山脈比所有它相鄰的山脈都低,則這段山脈是一個山谷。

地精們有一個共同的愛好——飲酒,酒館可以設立在山谷之中。地精的酒館不論白天黑夜總是人聲鼎沸,地精美酒的香味可以飄到方圓數裏的地方。

地精還是一種非常警覺的生物,他們在每座山峰上都可以設立瞭望臺,並輪流擔當瞭望工作,以確保在第一時間得知外敵的入侵。

地精們希望這N段山脈每段都可以修建瞭望臺或酒館的其中之一,只有滿足這個條件的整座山脈才可能有地精居住。

現在你希望知道,長度為N的可能有地精居住的山脈有多少種。兩座山脈A和B不同當且僅當存在一個i,使得Ai≠Bi。由於這個數目可能很大,你只對它除以P的余數感興趣。

輸入輸出格式

輸入格式:

輸入文件goblin.in僅含一行,兩個正整數N, P。

輸出格式:

輸出文件goblin.out僅含一行,一個非負整數,表示你所求的答案對P取余之後的結果。

輸入輸出樣例

輸入樣例#1: 復制
4 7
輸出樣例#1: 復制
3

波動數列
#include<bits/stdc++.h>
using
namespace std; #define maxn 5005 typedef long long ll; #define inf 0x3fffffff int dp[2][maxn]; int ans=0; int n,m; int main() { cin>>n>>m; dp[0][2]=1; for(int i=3; i<=n; i++) //從3開始因為你最開始只用得到3(i-j+1>=2) for(int j=2; j<=i; j++) dp[i&1][j]=(dp[i&1
][j-1]+dp[(i-1)&1][i-j+1])%m; for(int i=2; i<=n; i++) ans=(ans+dp[n&1][i])%m; cout<<(ans<<1)%m; return 0; }

P2467 [SDOI2010]地精部落