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的更多相关文章

  1. 【题解】POJ2279 Mr.Young′s Picture Permutations dp

    [题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...

  2. 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 ...

  3. poj2279 Mr. Young's Picture Permutations[勾长公式 or 线性DP]

    若干人左对齐站成最多5行,给定每行站多少个,列数从第一排开始往后递减.要求身高从每排从左到右递增(我将题意篡改了便于理解233),每列从前向后递增.每个人身高为1...n(n<=30)中的一个数 ...

  4. bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式

    2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec  Memory Limit: 128 MB Description   ...

  5. 轮廓线DP:poj 2279 Mr. Young's Picture Permutations

    poj 2279 Mr. Young's Picture Permutations \(solution:\) 首先摘取一些关键词:(每行不超过它后面的行)(每排学生安排高度从左到右减少)(学生的高度 ...

  6. Mr. Young's Picture Permutations

    Mr. Young's Picture Permutations 给出一个有k列的网格图,以及每列图形的高度\(n_i\),下端对齐,保证高度递减,设有n个网格,询问向其中填1~n保证每行每列单调递增 ...

  7. 【杨氏矩阵+勾长公式】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 ...

  8. [POJ 2279] Mr. Young's Picture Permutations

    [题目链接] http://poj.org/problem?id=2279 [算法] 杨氏矩阵与勾长公式 [代码] #include <algorithm> #include <bi ...

  9. 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从 ...

随机推荐

  1. Unity 之 Shader 面的剔除 Cull

    面的剔除 Cull 在渲染的时候,默认情况下是只有朝向摄像机的面才会被渲染,可以告诉Unity,我想渲染哪一个朝向的面,使用Cull命令在计算体积阴影的时候会用到对Cull的操作来计算和物体相交的投影 ...

  2. Git,GitHub以及GitLab的区别

    Git - 版本控制工具 Github - 一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等 GitLab - 基于Git的项目管理软件 Git分布式版本控制系统 Git是一款 ...

  3. SQLServerDBA十大必备工具

    曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了: 诚然,SSMS和Profile足够强大,工作的大 ...

  4. jstl中的日期格式化

    <% String strdate="2004/04/01";   Date a=new Date(strdate);   request.setAttribute(&quo ...

  5. linux 删除文件,某个文件例外

    # shopt -s extglob      (打开extglob模式) # rm -fr !(file1)

  6. HDU 1111 Secret Code (DFS)

    题目链接 题意 : 给你复数X的Xr和Xi,B的Br和Bi,让你求一个数列,使得X = a0 + a1B + a2B2 + ...+ anBn,X=Xr+i*Xi,B=Br+Bi*i : 思路 : 首 ...

  7. tomcat 无法clean 的bug

    如果你打开类似这种的文件夹了,那恭喜你,你无法正常clean E:\e\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 请关 ...

  8. 编写高质量代码改善C#程序的157个建议——建议97:优先考虑将基类型或接口作为参数传递

    建议97:优先考虑将基类型或接口作为参数传递 除了公开及类型或接口外,方法的参数也应该考虑基类型或接口. 以Enumerable类型为例,它的成员方法中只要涉及需要操作集合对象的地方,都要使用IEnu ...

  9. Linux-Linux基础入门

    第一节 Linux系统简介 初步了解了什么是Linux系统,有何优势.与Windows系统有何不同,并了解Linux学习方法. 第二节 基本概念及概念 1.完成实验楼入门基础课程,共两个实验:(1)& ...

  10. replaceState 实现返回从新定位

    在web 开发中,选择列表分类,在中商品, 详情页面后,返回的时候我们想定位到原来选择的分类 就需要借助window.history.replaceState来实现 function getProdu ...