【题目描述】
将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2012取模。
【输入格式】
第一行2个整数n,k。
【输出格式】
一个整数表示答案。
【样例输入】
5 2
【样例输出】
66
【数据范围】
对于30%的数据:n <= 10
对于100%的数据:k < n <= 1000,
从没有做过这么水的DP
1 #include<iostream> 2 using namespace std; 3 4 int n,k; 5 int F[1001][1001]; 6 7 int main() 8 { 9 cin>>n>>k; 10 for(int i=1;i<=n;i++) 11 F[i][0]=1; 12 for(int i=2;i<=n;i++) 13 { 14 int t=min(i-1,k); 15 for(int j=1;j<=t;j++) 16 { 17 F[i][j]=F[i-1][j]*(j+1)+F[i-1][j-1]*(i-j); 18 F[i][j]%=2012; 19 } 20 } 21 cout<<F[n][k]<<endl; 22 return 0; 23 }