數學+線性dp 不等數列(洛谷 P2401)

不等數列

題目描述

將1到n任意排列,然後在排列的每兩個數之間根據他們的大小關係插入“>”和“<”。問在所有排列中,有多少個排列恰好有k個“<”。答案對2015取模。

注:1 ~ n的排列指的是1~n這n個數各出現且僅出現一次的數列。


dp[i][j]表示前 i 個數字插入 k 個小於號的種類數;

dp[i][j]+=dp[i-1][j]*(j+1) ,j+1表示有 j 個小於號,還有加一個是數列的最左端那個位置,說明這 j+1 個位置都可以放入第 i 個數,並且小於號個數不變;

dp[i][j]+=dp[i-1][j-1]*(i-j),i-j 表示有i-j-1個大於號,還有加一個是數列的最右端的那個位置,說明這 i-j 個的位置可以放入第 i 個數,並且小於號個數加1;

代碼:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,LL>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=1100;
const int M=50100;
const int mod=2015;
int n,k,dp[N][N]; 
int main(){
	cin>>n>>k;
	dp[1][0]=1;
	for(int i=2;i<=n;i++){
		for(int j=0;j<i;j++){
			dp[i][j]+=dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j);
			dp[i][j]%=mod;
		}
	}
	cout<<dp[n][k]<<endl;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章