d[i][j][k]表示共i个人站队,从前面可以看到j个人,从后面可以看到k个人的方案个数。则d[i][j][k] = d[i-1][j][k] * (i-2) + d[i-1][j-1][k] + d[i-1][j][k-1] (假设新加入的一个人身高最小),边界条件是d[1][1][1] = 1。
以下是我的代码:
#include <iostream>
using namespace std;
typedef long long int64;
int64 d[17][17][17];
void Init () {
d[1][1][1] = 1;
for ( int i = 2; i <= 13; i++ )
for ( int j = 1; j <= i; j++ )
for ( int k = 1; k <= i; k++ )
d[i][j][k] = d[i-1][j][k] * ( i - 2 ) + d[i-1][j-1][k] + d[i-1][j][k-1];
}
int main () {
Init ();
int T, n, p, r;
cin >> T;
while ( T-- ) {
cin >> n >> p >> r;
cout << d[n][p][r] << endl;
}
return 0;
}
posted on 2011-11-06 10:53
lee1r 阅读(927)
评论(1) 编辑 收藏 引用 所属分类:
题目分类:数学/数论