BZOJ 1925 地精部落 DP

2021-08-15 09:43:22 字數 3419 閱讀 7226

其實不要小看一道地精部落,有比較大的思維量在裡面!

我們首先知道 3 個性質:

如果有想看證明的,請自動轉到**片下面,因為考慮有些人不想看證明

fi

rst fir

st

:對於每乙個 數字 i 和 i+1 , 如果這兩個數不是相鄰的,那麼交換兩個數字的對應的方案數是一樣的!

比如有 波動序列 32

415 324

15

和 1243512

435se

condse

cond

:我們由 1~n 的波動數列的任意一種,將每乙個 aiai

都可以用(n+1) 減去,那麼得到的新的序列其實還是合法的,而且相對的山谷和山峰會改變!

比如有 波動序列

32415

32415

和 34251

34251

thir

d thi

rd

:波動數列具有對稱性……

其實就是變成了 dp

[i][

j]= dp[

i][j

]=

dp[i−1

][j]

+ dp[

i−1]

[j]+

dp[i−1

][i+

1−j]dp

[i−1

][i+

1−j]

dp

[i][

j]d p[

i][j

]表示可以 用 當前離散化之後的1~i 號的以

j j

為開頭的山峰的方案個數

我們可以思考一下:

一. 我們假設有

j' role="presentation" style="position: relative;">jj與

j+1 j+1

並不相鄰—>那麼我們就是方案數為 dp

[i−1

][j]

d p[

i−1]

[j

]為什麼?

因為dp

[i][

j−1]dp

[i][

j−1]

表示的是 將j放入第乙個的方案數,而且 j−

1 j−1

就是山峰,那麼我們就知道了

j j

肯定不是第二個,那麼這樣j−

1' role="presentation" style="position: relative;">j−1

j−1就不是山峰了!

二. 如果j

j

與 j−

1' role="presentation" style="position: relative;">j−1

j−1是相鄰的,那麼此時的方案數就是 dp[i+1-j]

因為我們可以考慮就是

j j

,j−1' role="presentation" style="position: relative;">j−1

j−1,

????

... ???

?...

那麼就是相當於轉換成了

1 1

~i−1' role="presentation" style="position: relative;">i−1

i−1的數字 j−

1 j−1

為山谷的情況了! 因為

j>j−

1 j

>j−

1那麼j-1 的右邊只能是 比j−

1 j−1

要大的數字,也就是它是山谷的時候了!

那麼我們根據性質二可以知道就是等同於 給你 [1

,j−1

]u[j

+1,i

] [1,

j−1]

u[j+

1,i]

的數,讓你求以 j−

1 j−1

開頭的山谷的方案數.那麼其實又可以發現[j

+1,i

] [j+

1,i]

的數 其實也就是相當於 [j

,i−1

] [j,

i−1]

,可以自行思考一發!

那麼就是求 1~i-1 以 j−

1 j−1

為開頭的山谷的方案數. 也就是同時 用 i−

1+1 i−1

+1

減去之後的方案數,即dp[i-1][i-1+1-(j-1)] = dp[i-1][i+1-j]的方案數.!

用了滾動陣列!

#pragma gcc optimize(2)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 4201

#define n 1000050

#define inf 0x3f3f3f3f

#define p pair

#define ll long long

using

namespace

std;

int n,mod,dp[2][maxn];

inline ll read()

while(c>='0'&&c<='9')

return flag?-x:x;

}int main(int argc,char

const* argv)

fi

rst:fi

rst:

比如有j ….. j+1

那麼他們左右的數字要麼是比 j-1 要小 要麼是比 j+1要大,那麼我們列一列情況會發現沒有什麼不合法的情況se

cond

: sec

ond:

意會一下… th

ird:th

ird:

意會一下…

BZOJ 1925 地精部落 DP

description 僅含一行,兩個正整數 n,p。output 僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。sample input 4 7 sample output 3 hint 對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿...

BZOJ1925 地精部落

題目描述 輸入格式 僅含一行,兩個正整數 n,p。輸出格式 僅含一行,乙個非負整數,表示你所求的答案對p取餘之後的結果。樣例樣例輸入 4 7樣例輸出 3資料範圍與提示 對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿足 n 550 對於 100 的資料,...

BZOJ 1925地精部落題解

題目鏈結 一道神仙題,有很多思考的方式,這裡選擇最好理解的一種來講 我們將序列分為兩種,一種開頭遞增,一種開頭遞減,顯然這兩種序列的數目是一樣的 現在我們只用考慮開頭遞增的情況 f i j 表示前i個數,最後乙個數字在前i個數的排名在1 j之間的方案數 顯然有f i j f i j 1 如果最後乙個...