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 閱讀(939)
評論(1) 編輯 收藏 引用 所屬分類:
題目分類:數學/數論