P2401 不等數列
思路:這個數據。顯然可以考慮。
令表示前個數有個小於號的排列數。
假設我們已知前個數所有情況。
接下來我們需要插入第個數,我們有個位置插入。
對於最左邊和最右邊,顯然是增加一個大於號和小於號。
對於其他位置:1.插入到大於號的位置:顯然小於號增加一個
2.插入到小於號的位置:,大於號增加一個。
因此小於號的個數只會是非減的。
於是有
表示有個位置插入後小於號的數目不變,即最左邊和個大於號的位置。
。表示位置插入後小於號個數增加一個,,有個位置是小於號個數不變。
則另外個位置是使小於號加1.
綜上
時間複雜度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=1e6+5,inf=0x3f3f3f3f,mod=2015;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
int dp[N][N],n,k;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) dp[i][0]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=min(i-1,k);j++)
dp[i][j]=(dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j))%mod;
printf("%d\n",dp[n][k]);
return 0;
}