ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mr Youngs Picture Permutations 题解报告

2019-05-18 10:48:58  阅读:298  来源: 互联网

标签:Picture lceil31 个人 方案 题解 31 Permutations rceil 行站


题目传送门

【题目大意】

给定行数以及每一行的的人数,求方案数,要求从前往后,从左往右身高递增。

【思路分析】

这里没有必要考虑究竟是怎么排的,只要方案数就好啦,然后看到数据范围最大是5行,那么就考虑DP

设$f[a][b][c][d][e]$为第1行站了a个人,第2行站了b个人,第3行站了c个人,第4行站了d个人,第5行站了e个人的方案数

接下来考虑一下转移方程。

首先很明显的条件就是某一个位置在其左边和上面的位置都有人的情况下才可以安排人,这时这个位置的方案数就要加上安排之前的方案数

然后还要注意一下开数组不能直接开$f[31][31][31][31][31]$,那样会爆空间。因为后面一行人数肯定不大于前面一行,所以我们可以只开$f[31][\lceil31/2\rceil][\lceil31/3\rceil][\lceil31/4\rceil][\lceil31/5\rceil]$

【代码实现】

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ll long long
 4 #define go(i,a,b) for(register int i=a;i<=b;i++)
 5 using namespace std;
 6 int k,n[6];
 7 ll f[31][31/2+1][31/3+1][31/4+1][31/5+1];
 8 int main(){
 9     while(1){
10         scanf("%d",&k);
11         if(k==0) return 0;
12         memset(n,0,sizeof(n));memset(f,0,sizeof(f));
13         go(i,1,k) scanf("%d",&n[i]);
14         f[0][0][0][0][0]=1;
15         go(a,0,n[1]) go(b,0,n[2]) go(c,0,n[3]) go(d,0,n[4]) go(e,0,n[5]){
16             ll as=f[a][b][c][d][e];
17             if(a<n[1]) f[a+1][b][c][d][e]+=as;
18             if(b<n[2]&&b<a) f[a][b+1][c][d][e]+=as;
19             if(c<n[3]&&c<b) f[a][b][c+1][d][e]+=as;
20             if(d<n[4]&&d<c) f[a][b][c][d+1][e]+=as;
21             if(e<n[5]&&e<d) f[a][b][c][d][e+1]+=as;
22         }
23         printf("%lld\n",f[n[1]][n[2]][n[3]][n[4]][n[5]]);
24     }
25     return 0;
26 }
代码戳这里

 

标签:Picture,lceil31,个人,方案,题解,31,Permutations,rceil,行站
来源: https://www.cnblogs.com/THWZF/p/10884921.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有