问题描述

杨老师希望给他的班级拍一张合照。

学生们将站成左端对齐的多排,靠后的排站的人数不能少于靠前的排。

例如,12名学生(从后向前)可以排列成每排5,3,3,1人,如下所示:

X X X X X
X X X
X X X
X

同时,杨老师希望同行学生身高从左到右依次降低,同列学生身高从后向前依次降低。

还以12名学生为例,给学生们编号(号码越小代表身高越高)后,按照此规则可进行如下两种安排:

1  2  3  4  5     1  5  8  11  12
6 7 8 2 6 9
9 10 11 3 7 10
12 4

杨老师希望知道给定每排的人数,在满足规则的情况下,一共能有多少种位置安排。

例如,规定一共三排,每排3,2,1人,则共有16种安排方法如下:

123 123 124 124 125 125 126 126 134 134 135 135 136 136 145 146
45 46 35 36 34 36 34 35 25 26 24 26 24 25 26 25
6 5 6 5 6 4 5 4 6 5 6 4 5 4 3 3

现在请你编写一个程序,确定在给定每排人数的情况下,不同安排的数量。

输入格式

输入包含多组测试数据。

每组数据两行,第一行包含一个整数k表示总排数。

第二行包含k个整数,表示从后向前每排的具体人数。

当输入k=0的数据时,表示输入终止,且该数据无需处理。

输出格式

每组测试数据输出一个答案,表示不同安排的数量。

每个答案占一行。

数据范围

1≤k≤51≤k≤5,学生总人数不超过30人。

输入样例:

1
30
5
1 1 1 1 1
3
3 2 1
4
5 3 3 1
5
6 5 4 3 2
2
15 15
0

输出样例:

1
1
16
4158
141892608
9694845
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i = a; i < n; ++i)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pri(x) printf("%d\n",x)
typedef pair<int,int> P;
typedef long long ll;
const ll inf = ;
const int INF =0x3f3f3f3f;
const int mod = 1e9+;
const int maxn =;
const int N = 1e5+;
int k;
int a[];
ll dp[][][][][];
int main(){
while(sca(k) && k){
memset(a,,sizeof a);
memset(dp,,sizeof dp);
dp[][][][][] = ;
for(int i = ; i <= k; i++)
sca(a[i]);
for(int i = ; i <= a[]; i++)
for(int j = ; j <= a[]; j++)
for(int u = ; u <= a[]; u++)
for(int v = ; v <= a[]; v++)
for(int p = ; p <= a[]; p++){
if(i <= a[] - ) dp[i + ][j][u][v][p] += dp[i][j][u][v][p];
if(j <= a[] - && j < i) dp[i][j + ][u][v][p] += dp[i][j][u][v][p];
if(u <= a[] - && u < i && u < j) dp[i][j][u + ][v][p] += dp[i][j][u][v][p];
if(v <= a[] - && v < i && v < j && v < u) dp[i][j][u][v + ][p] += dp[i][j][u][v][p];
if(p <= a[] - && p < i && p < j && p < u && p < v) dp[i][j][u][v][p + ] += dp[i][j][u][v][p];
}
printf("%lld\n",dp[a[]][a[]][a[]][a[]][a[]]);
}
}

最新文章

  1. fdisk添加分区引起的Linux Error: 22: Invalid argument
  2. ubuntu 编译oce Open CASCADE
  3. Linux文件打包压缩、解压缩、备份命令使用方法(转载)
  4. FileInputstream的available()方法
  5. mysql批量更新
  6. 【COCOS2DX-对28游戏开发】 Cocos2d-x-3c 道路设计 CocosBase CocosNet CocosWidget
  7. cocos2dx 使得单麻将(三)
  8. poj - 1185 炮兵阵地 状压DP 解题报告
  9. POJ 1721 CARDS
  10. JavaScript之DOM创建节点
  11. zTree:一个依靠 jQuery 实现的多功能 “树插件”
  12. 16.4-uC/OS-III同步 (任务信号量)
  13. 实现qq登录
  14. 英文版Ubuntu18.10安装搜狗输入法过程(图文并茂,亲自尝试!)
  15. 自己写的一个delphi正整数快速排序
  16. numpy的ravel()和flatten()函数比较
  17. 线段树区间更新(set暴力)
  18. 51nod 1449 砝码称重 (进制思想)
  19. [APIO2007]动物园 --- 状压DP
  20. Linux之shell

热门文章

  1. JAVA时间Date工具类
  2. How to Preloading content with rel preload
  3. Spring Security 内置过滤器表
  4. newcode网学习笔记(1)
  5. python打包
  6. IOT
  7. 微信扫描二维码安卓弹出默认浏览器(苹果打开App Store)打开下载链接
  8. Django model 字段类型及选项解析---转载
  9. [游戏开发日志]Windows下Cocos2d-x 3.14环境搭建
  10. Connector for Python