递推。
设f[柱子数量][从左边能看到的数量][从右边能看到的数量]=方案数
假设2~i高度的柱子都已经安排好,现在要插入高度为1的柱子。若它放在最左边,左边可见数量+1,放在最右边,右边可见数量+1,放在中间(有i-2个可能位置),左右可见数量不变。
递推完一个高度i时,假设把所有在场的柱子都拔高1单位高度,此时方案数不变,再加一个高度为1的柱子进去……
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define LL long long 8 using namespace std; 9 const int mxn=30; 10 LL f[mxn][mxn][mxn]; 11 void init(){ 12 int i,j,k;//有i个方块,从左边看能看到j个,从右边看能看到k个 13 f[1][1][1]=1; 14 for(i=1;i<=20;i++){ 15 for(j=1;j<=20;j++){ 16 for(k=1;k<=20;k++){ 17 f[i][j][k]+=f[i-1][j][k]*(i-2)+f[i-1][j-1][k]+f[i-1][j][k-1]; 18 } 19 } 20 } 21 } 22 int n,l,r; 23 int main(){ 24 init(); 25 int T; 26 scanf("%d",&T); 27 while(T--){ 28 scanf("%d%d%d",&n,&l,&r); 29 printf("%lld\n",f[n][l][r]); 30 } 31 return 0; 32 }
时间: 2024-10-03 15:48:11