UVA1638PoleArrangement

//UVA1638PoleArrangement
#include<cstdio>
#include<cstring>
int n, l, r;
const int maxn = 20;
long long d[maxn + 5][maxn + 5][maxn + 5];
long long dp(int i, int j, int k) {//i爲已經安排好的杆的數量,j爲從左邊看,k爲從右邊看 
	if(i && (k == 0 || j == 0)) return 0;
	if(i < j || i < k) return 0;
	if(i == 1) return 1;
	if(d[i][j][k] >= 0) return d[i][j][k];
	return d[i][j][k] = dp(i - 1, j, k - 1) + dp(i - 1, j - 1, k) + dp(i - 1, j, k) * (i - 2);
}
int main() {
	int T;
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d%d", &n, &l, &r);
		memset(d, -1, sizeof(d));
		printf("%lld\n", dp(n, l, r));
	}
	return 0;
}
/*
4
4 1 2
4 1 1
5 2 4
20 2 1
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章