显然,n有n个位置可以选择,我们先来考虑两边的位置。
如果插入到最左边,会造成新的序列比原来多一个大于号
如果插入到最右边,会造成新的序列比原来多一个小于号
如果插入到大于号的位置,删去一个大于号,多一个大于号一个小于号,也就是多一个小于号
如果插入到小于号的位置,删去一个小于号,多一个大于号一个小于号,也就是多一个大于号
那么显然:
f[i+1][j]=(f[i+1][j]+(f[i][j]*(j+1)))%p;
f[i+1][j+1]=(f[i+1][j+1]+(f[i][j]*(i-j)))%p;
#include <bits/stdc++.h> #define p 2015; using namespace std; long long f[1010][1010]; int main() { int n,m; cin>>n>>m; f[0][0]=1; for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ f[i+1][j]=(f[i+1][j]+(f[i][j]*(j+1)))%p; f[i+1][j+1]=(f[i+1][j+1]+(f[i][j]*(i-j)))%p; } } cout<<f[n][m]%p; }