分析|推导:
f[n][m] : n个符号,其中有m个等号
n=1 1
f[1][0] = 1
n=2
f[2][0] A(2,2)=2*f[1][0] = 2 = n*f[n-1][0]
f[2][1] f[1][0]基础上增加一个“=a2”,有1个位置可放,1*f[1][0] = 1 ==> f[n][n-1]=f[n-1][n-2]
==》sum(2) = 3
n=3
f[3][0] A(3,3)=3*f[2][0] = 6 = n*f[n-1][0]
f[3][1] f[2][0]基础上增加一个“=a3”,有2个位置可放,2*f[2][0] = 4 = (n-1)*f[n-1][0]
f[2][1]基础上增加一个“<a3”,有2个位置可放,2*f[2][1] = 2 = (n-1)*f[n-1][1]
==》f[3][1] = 6
f[3][2] f[2][1]基础上增加一个“=a3”,有1个位置可放,1*f[2][1] = 1 ==> f[n][n-1]=f[n-1][n-2]
==》sum(3) = 13
n=4
f[4][0] A(4,4)=4*f[3][0] = 24
f[4][1] f[3][0]基础上增加一个“=a4”,有3个位置可放,3*f[3][0] = 18 = (n-1)*f[n-1][0]
f[3][1]基础上增加一个“<a4”,有3个位置可放,3*f[3][1] = 18 = (n-1)*f[n-1][1]
==》f[4][1] = 36
f[4][2] f[3][1]基础上增加一个“=a4”,有2个位置可放,2*f[3][1] = 12 = (n-2)*f[n-1][1]
f[3][2]基础上增加一个“<a4”,有2个位置可放,2*f[3][2] = 2 = (n-2)*f[n-1][2]
==》f[4][2] = 14
f[4][3] f[3][2]基础上增加一个“=a4”,有1个位置可放,1*f[3][2] = 1 = (n-3)*f[n-1][2]
==》sum(4) = 75
n=5
f[5][0] A(5,5)=5*f[4][0] = 120
f[5][1] f[4][0]基础上增加一个“=a5”,有4个位置可放,4*f[4][0] = 96 = (n-1)*f[n-1][0]
f[4][1]基础上增加一个“<a5”,有4个位置可放,4*f[4][1] = 144 = (n-1)*f[n-1][1]
==》f[5][1] = 240
f[5][2] f[4][1]基础上增加一个“=a5”,有3个位置可放,3*f[4][1] = 108 = (n-2)*f[n-1][1]
f[4][2]基础上增加一个“<a5”,有3个位置可放,3*f[4][2] = 42 = (n-2)*f[n-1][2]
==》f[5][2] = 150
f[5][3] f[4][2]基础上增加一个“=a5”,有2个位置可放,2*f[4][2] = 28 = (n-3)*f[n-1][2]
f[4][3]基础上增加一个“<a5”,有2个位置可放,2*f[4][3] = 2 = (n-3)*f[n-1][3]
==》f[5][3] = 30
f[5][4] f[4][3]基础上增加一个“=a5”,有1个位置可放,1*f[4][3] = 1 = (n-4)*f[n-1][3]
==》f[5][4] = 1
==》sum(5) = 120+240+150+30+1= 541
结论:
f[n][0] = A(n,n) 对应没有“=”的情况,n个符号全排列。
f[n][n-1] = ... = f[1][0] == 1 对应全为“=”的情况,只有一种方式。
f[n][m] (1<=m<=n-2)的情形:可总结为以下状态转移方程:
f[n][m] = ( (n-m)*(f[n-1][m-1] + f[n-1][m]))
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define MOD (1000000007)
int n;
long long f[2001][2001];
//f[n][m]: n个符号,m个"=", (0<=m<n)
int main(){
cin>>n;
// 初始化、 边界条件
f[0][0] = 1;
for(int i=1; i<=n; i++){
f[i][0] = (i*f[i-1][0])%MOD; // A(i,i)
f[i][i-1] = 1;//全等号的情况
}
for(int i=2; i<=n; i++){
for(int j=1; j<=i-2; j++){
f[i][j] = ( (i-j) * (f[i-1][j-1] + f[i-1][j]) )%MOD;
}
}
//test
/*
for(int i=0; i<=n; i++){
for(int j=0; j<=n; j++){
cout<<f[i][j]<<" ";
}
cout<<endl;
}
*/
//结果
int ans=0;
for(int k=0; k<n; k++){
ans = (ans+f[n][k])%MOD;
}
cout<<ans;
return 0;
}