POJ2279 Mr Young's Picture Permutations
POJ2279 Mr Young's Picture Permutations
描述: 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前。
学生身高依次是1…N。在合影时候要求每一排从左到右递减,每一列从后面到前也递减,一共有多少总方案
输入
每组测试数据包含两行。第一行给出行数k。第二行包含从后到前(n1,n2,…,nk)的行的长度,作为由单个空格分隔的十进制整数。
问题数据以0结束。
N<=30, k<=5;
输出 输出每组数据的方案数
样例输入
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
- 法一: dp
用一个k元组来表示每一行已经确定的人数即可描述一个状态,进行转移即可。
tip:从本题中可知,设计动态规划的状态转移方程不一定要以如何计算出一个状态的形式给出,也可以考虑用一个已知的状态更新后续阶段的状态
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
long long dp[][][][][];//空间注意计算,否则会开爆(31,31/2,31/3...)
//f(a1,a2,a3,a4,a5)表示第i层有a[i]个人时的方案数
int k,num[];
int main()
{
while(scanf("%d",&k) && k)
{
memset(dp,,sizeof(dp));
memset(num,,sizeof(num));
for(int i= ; i<=k ; i++) scanf("%d",&num[i]);
dp[][][][][]=;
for(int i= ; i<=num[] ; i++)
{
for(int j= ; j<=num[] ; j++)
{
for(int k= ; k<=num[] ; k++)
{
for(int l= ; l<=num[] ; l++)
{
for(int p= ; p<=num[] ; p++)
{
if(i+<=num[])
dp[i+][j][k][l][p]+=dp[i][j][k][l][p];
if(j+<=num[]&&j<i)
dp[i][j+][k][l][p]+=dp[i][j][k][l][p];
if(k+<=num[]&&k<j&&k<i)
dp[i][j][k+][l][p]+=dp[i][j][k][l][p];
if(l+<=num[]&&l<k&&l<j&&l<i)
dp[i][j][k][l+][p]+=dp[i][j][k][l][p];
if(p+<=num[]&&p<l&&p<k&&p<j&&p<i)
dp[i][j][k][l][p+]+=dp[i][j][k][l][p]; }
}
}
}
}
printf("%lld\n",dp[num[]][num[]][num[]][num[]][num[]]);
}
return ;
}
- 法二:(数学解法)杨氏矩阵和勾长公式
转载:巨佬博客
杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:
(1)如果格子(i,j)没有元素,则它右边和上边的相邻格子也一定没有元素。
(2)如果格子(i,j)有元素a[i][j] a[i][j]a[i][j],则它右边和上边的相邻格子要么没有元素,要么有元素且比a[i][j] a[i][j]a[i][j]大。
1 ~ n所组成杨氏矩阵的个数可以通过下面的递推式得到:如图就是n=3时的杨氏矩阵。
下面介绍一个公式,那就是著名的钩子公式。
对于给定形状,不同的杨氏矩阵的个数为:n!除以每个格子的钩子长度加1的积。其中钩子长度定义:每个格子右边的格子数和它上边的格子数之和。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; inline int gcd(int a,int b)
{
return (b==)?a:gcd(b,a%b);
}
int d[],num[];
int n;
int main()
{
while(scanf("%d",&n)&&n)
{
int tot=;
memset(num,,sizeof(num));
for(int i= ; i<=n ; i++) scanf("%d",&d[i]);
for(int i=n ; i>= ; i--)
for(int j= ; j<=d[i] ; j++)
{
tot++;
for(int k=i+ ; k<=n ; k++)
if(d[k]>=j) num[tot]++;
else break;
num[tot]+=d[i]-j+;
}
long long t1=,t2=;
for(int i= ; i<=tot ; i++)
{
t1*=i; t2*=num[i];
int t=gcd(t1,t2);
t1/=t,t2/=t;
}
printf("%lld\n",t1/t2);
}
return ;
}
POJ2279 Mr Young's Picture Permutations的更多相关文章
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...
- poj2279——Mr. Young's Picture Permutations
Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...
- poj2279 Mr. Young's Picture Permutations[勾长公式 or 线性DP]
若干人左对齐站成最多5行,给定每行站多少个,列数从第一排开始往后递减.要求身高从每排从左到右递增(我将题意篡改了便于理解233),每列从前向后递增.每个人身高为1...n(n<=30)中的一个数 ...
- bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- 轮廓线DP:poj 2279 Mr. Young's Picture Permutations
poj 2279 Mr. Young's Picture Permutations \(solution:\) 首先摘取一些关键词:(每行不超过它后面的行)(每排学生安排高度从左到右减少)(学生的高度 ...
- Mr. Young's Picture Permutations
Mr. Young's Picture Permutations 给出一个有k列的网格图,以及每列图形的高度\(n_i\),下端对齐,保证高度递减,设有n个网格,询问向其中填1~n保证每行每列单调递增 ...
- 【杨氏矩阵+勾长公式】POJ 2279 Mr. Young's Picture Permutations
Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...
- [POJ 2279] Mr. Young's Picture Permutations
[题目链接] http://poj.org/problem?id=2279 [算法] 杨氏矩阵与勾长公式 [代码] #include <algorithm> #include <bi ...
- POJ P2279 Mr. Young's Picture Permutations 题解
每日一题 day14 打卡 Analysis 五维dpf[a1,a2,a3,a4,a5]表示各排从左端起分别占了a1,a2,a3,a4,a5个人时合影方案数量然后我们枚举a1,a2,a3,a4,a5从 ...
随机推荐
- Thinking in 查询设计
近日,互联网动物园的各位小伙伴们召开了一次会议,考虑到大火的电子商务,准备在动物园里开发一个电商系统.首先上台的是销售山鸡,清了清嗓子,说道,人类正在进行电商革命,动物园也需要上一个电商系统,必要性有 ...
- 存储过程中使用事务和try catch
一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...
- WebAPI的路由规则
1.自定义路由 public static class WebApiConfig { public static void Register(HttpConfiguration config) { / ...
- CentOS JAVA安装及查看路径方法
一.安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ...
- Qt5.7学习
一 Qt简介(Build your world with Qt) 二 Qt5.7.0的安装 三 Qt系统构造库及常用类 四 信号(signal)与槽(slot)通信机制 五 QtDesigner开发工 ...
- python 多继承详解-乾颐堂
1 2 3 4 5 6 7 8 9 10 class A(object): # A must be new-style class def __init__(self): prin ...
- [SoapUI] 通过Groovy获取SoapUI当前Project所在的目录
import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def proje ...
- MySQL 授权,回收权限,查看权限
show GRANTS for root@localhost;flush privileges;SHOW PROCESSLIST; #全局授权,回收权限GRANT ALL ON *.* TO 'tes ...
- python列表技巧
1.访问列表元素 test1 = ["chengqian","and","what"] print(test1[0])#第一个元素 prin ...
- Introduction mybatis
项目地址 https://github.com/mybatis/mybatis-3 英文官网 http://mybatis.github.io/mybatis-3/ 中文官网 http://mybat ...