题目传送门:1687. Permutation
思路:
求n个数其中有k个 < 的全排列种数,可以先考虑n - 1个数的情况。
假设n - 1个数已经排好,要使插进最后的数n后刚好有k个<,说明这时候已经有k个<,插进n后增加了一个>,或者这时有k - 1个<,插进n后再增加一个<。
1.n - 1个数中有k个< :插进n后不能增加<,可以在原来两个数之间是<的间隙插入,或者在开头插入,共有k + 1种。
2.n - 1个数中有k - 1个< :插进后增加一个<,可以在原来两个数之间是>的间隙插入,或者在末尾插入,共有n - k种。
这样就可以利用n -1的情况算n的情况。开始用了递归超时了,考虑到其中重复计算了很多次相同的情况,所以用数组result[n][k]把所有结果存进去,然后直接读入输出即可。
代码:
1 #include<iostream> 2 using namespace std; 3 4 5 const int MAXN = 101,MAXK = 101; 6 int result[MAXN][MAXK] = {{0}}; 7 8 int main(){ 9 result[1][0] = 1; 10 for(int n = 2;n < MAXN;n++){ 11 result[n][0] = 1; 12 for(int k = 1;k < n;k++){ 13 result[n][k] = (result[n - 1][k] * (k + 1) + result[n - 1][k - 1] * (n - k)) % 2007; 14 } 15 } 16 int n,k; 17 while(cin >> n >> k){ 18 cout << result[n][k] << endl; 19 } 20 return 0; 21 }