UVa 1638 Pole Arrangement

递推。

设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
",f[n][l][r]);
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/SilverNebula/p/5872307.html