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...