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. Quaternion.identity是什么意思?

    Quaternion.identity就是指Quaternion(0,0,0,0),

  2. A*搜索 概念

    启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无畏的搜索路径,提到了效率.在启发式搜索中,对位置的估价是十分重要 ...

  3. nyoj746 整数划分

    nyoj746 http://acm.nyist.net/JudgeOnline/problem.php?pid=746 一道区间dp的题目: 设:a[i][j]为那一串数字中从第i位到第j位的数是多 ...

  4. Python3 urllib.parse 常用函数示例

    Python3 urllib.parse 常用函数示例 http://blog.51cto.com/walkerqt/1766670  1.获取url参数. >>> from url ...

  5. 一个新手后端需要了解的前端核心知识点之margin(二)

    最近以开发自己博客网站为出发点开始决心打牢几个非常重要的前端知识点: margin,这个在我刚刚接触编程的时候留下的困扰的东西,一开始只想着怎么快速开发自己的网站,别人的终归是别人的,想要挖墙脚,必须 ...

  6. CentOS/RedHat安装Python3

    CentOS/RedHat安装Python3 摘自:https://blog.csdn.net/mvpboss1004/article/details/79377019 CentOS/RedHat默认 ...

  7. console对象的理解

    console对象代表浏览器的JS控制台,虽然不是标准,但已经成为事实的标准 console对象的作用 a.显示代码运行错误信息 b.提供一个命令行接口,用来与网页互动 console对象拥有很多方法 ...

  8. jenkins持续集成之Global Tool Configuration的配置

    Global Tool Configuration的配置过程: 1.点击系统管理2.点击 Global Tool Configuration3.必须配置: jdk git ant maven 1.点击 ...

  9. java Concurrent包学习笔记(二):CountDownLatch和CyclicBarrier

    一.CountDownLatch CountDownLatch一个线程同步的工具,是的一个或者多个线程等待其他线程操作完成之后再执行. CountDownLatch通过一个给定的数值count来进行初 ...

  10. RF和GBDT的区别

    Random Forest ​采用bagging思想,即利用bootstrap抽样,得到若干个数据集,每个数据集都训练一颗树. 构建决策树时,每次分类节点时,并不是考虑全部特征,而是从特征候选集中选取 ...