BZOJ 2431 逆序對數列

2021-08-20 11:40:26 字數 1385 閱讀 2478

time limit: 5 sec  memory limit: 128 mb

submit: 2611 solved: 1526

[submit][status][discuss]

description

對於乙個數列,如果有i

aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1~n自然數組成的

數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?

input

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

output

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

sample input

4 1sample output

3樣例說明:

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

100%的資料 n<=1000,k

<=1000

hint

source

day1

先想到區間dp,發現只記錄字首就行,所以二維就可以解決。

f[i][j],前i個數,j個逆序對的方案數。

對於新加入的i+1,可以造成i+1種逆序對,所以列舉前面的就行了。

先寫的暴力版本,tle兩個點,一算10000*1000沒爆int,把mod放外面,快了不少,過了乙個點,然後迴圈展開,不開o2也跑得飛快(相較樸素暴力…)

#include

#include

using

namespace

std;

int n,k;

int f[1005][1005]=;

int main()

for(l;lif(jcontinue;

f[i][j]+=f[i-1][j-l];

}f[i][j]%=10000;}}

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

return

0;}

正解是字首和優化,每次更新都是加一段連續區間的值,可以用字首和降複雜度。

#include

#include

using

namespace

std;

const

int maxn=1005;

const

int mod=10000;

int dp[maxn][maxn];

int n,k,ans,sum;

int main()

}printf("%d\n",dp[n][k]);

return

0;}

BZOJ 2431 逆序對數列 DP

2431 haoi2009 逆序對數列 time limit 5 sec memory limit 128 mb description 對於乙個數列,如果有i j且ai aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為...

BZOJ2431 逆序對數列 KEY

題目傳送門 不知道今天是怎麼了,可能是空調吹多了吧,一直不在狀態,連遞推題我都做不來了 扎zn了老fe 然而,不管環境如何惡劣,我們仍要努力學習,為了自己的明天而奮鬥。說的好像跟真的一樣 其實這題就是乙個遞推,現在我們考慮第i個數,定義f i j 表示序列裡有i個數,逆序對的組數為j的方案數。因為第...

BZOJ2431 逆序對數列(動態規劃)

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