bzoj2431 HAOI2009 逆序對數列

2021-06-22 12:14:56 字數 919 閱讀 1672

對於乙個數列,如果有ii>aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1~n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?

第一行為兩個整數n,k。

寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數後的結果。

樣例輸入

4 1樣例輸出

3樣例說明:

下列3個數列逆序對數都為1;分別是1 2 4 3 ;1 3 2 4 ;2 1 3 4;

測試資料範圍

30%的資料 n<=12

100%的資料 n<=1000,k<=1000

最近越來越喜歡做奇怪的dp了……

dp方程還是比較好想的:f[i][j]表示前i個數的排列、共有j對逆序對的方案數。考慮從f[i-1][...]如何轉移到f[i][...]:當從i-1個數的排列中插入第i個數的時候,逆序對的個數增加值等於插入位置後面小於i的數的個數。但是i-1的排列不是都小於i嗎……於是逆序對的個數增加值等於插入位置後面的數字的個數。但是插入位置後面的數字的個數也是有限制的:因為是往i-1個數裡加,所以增加的個數只能取0到i-1。所以f[i][j]=σf[i-1][j-k],0<=k

#include#include#includeusing namespace std;

#define mod 10000

int n,m;

int cur,pre;

int s[2][1001];

int f[1001][1001];

int main()

memset(s[pre],0,sizeof s[pre]);

} printf("%d",f[n][m]);

}

bzoj2431 HAOI2009 逆序對數列

天哪天哪天哪 我們用f i j 來表示前i個數,有j對逆序對的方案數,so考慮插入,因為i比1到i 1裡面的任何乙個數都要大,所以插入的時候後面有多少個數,就會多出多少逆序對,所以前面的符合條件的都可以轉移,f i j sigma f i 1 j k k屬於0到i 1,然而字首和神煩.include...

bzoj2431 HAOI2009 逆序對數列

dp 令b i j 表示n i,k j時的答案 則b 1 0 1 b 2 0 1 b 2 1 1 b 3 0 1 b 3 1 2 b 3 2 2 b 3 3 1 我們觀察發現 至少我是觀察 b i j b i 1 j i 1 b i 1 j 注意j i 1 0時令其為0 j i 1 i 2 2,即j...

BZOJ2431 HAOI2009 逆序對數列

對於乙個數列,如果有ii aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?第一行為兩個整數n,k。寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數...