题目:http://poj.org/problem?id=2279

书上的DP做法会爆内存,尝试写了一个,过了样例。

转载:

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll unsigned long long
using namespace std;
ll k,n[],f[][][][][];
void cl(ll a1,ll a2,ll a3,ll a4,ll a5)
{
if(a1)f[a1][a2][a3][a4][a5]+=f[a1-][a2][a3][a4][a5];
if(a2)f[a1][a2][a3][a4][a5]+=f[a1][a2-][a3][a4][a5];
if(a3)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3-][a4][a5];
if(a4)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3][a4-][a5];
if(a5)f[a1][a2][a3][a4][a5]+=f[a1][a2][a3][a4][a5-];
}
int main()
{
while(scanf("%lld",&k)==)
{
memset(f,,sizeof f);
memset(n,,sizeof n);//!!!
if(!k)return ;
for(ll i=;i<=k;i++)
scanf("%lld",&n[i]);
f[][][][][]=;
for(ll a1=;a1<=n[];a1++)
{
if(k>=)
for(ll a2=;a2<=n[]&&a2<=a1;a2++)
{
if(k>=)
for(ll a3=;a3<=n[]&&a3<=a2;a3++)
{
if(k>=)
for(ll a4=;a4<=n[]&&a4<=a3;a4++)
{
if(k>=)
for(ll a5=;a5<=n[]&&a5<=a4;a5++)
cl(a1,a2,a3,a4,a5);
else cl(a1,a2,a3,a4,);
}
else cl(a1,a2,a3,,);
}
else cl(a1,a2,,,);
}
else cl(a1,,,,);
}
printf("%lld\n",f[n[]][n[]][n[]][n[]][n[]]);
}
return ;
}

然后看到了“杨氏矩阵”与“钩子公式”。

转载:


杨氏矩阵定义(需满足的条件/特征):(1)若格子(i,j),则该格子的右边和上边一定没有元素;
                     (2)若格子(i,j)有元素data[i][j],则该格子右边和上边相邻的格子
                    要么没有元素,要么有比data[i][j]大的元素。
显然有同已写元素组成的杨氏矩阵不唯一,1~n组成杨氏矩阵的个数可以写出:F[1]=1,F[2]=2,
                                    F[n]=F[n-1]+(n-1)*F[n-2] (n>2)。
 
钩子长度的定义:该格子右边的格子数和它上边的格子数之和;
钩子公式:对于给定形状,不同的杨氏矩阵的个数为(n!/(每个格子的钩子长度加1的积))。

于是直接用了,注意要步步约分。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll unsigned long long
using namespace std;
int k,n[];
ll h[][],s1,s2;
ll gcd(ll x,ll y){
return x%y==?y:gcd(y,x%y);}
int main()
{
while(scanf("%d",&k)==)
{
if(!k)return ;
memset(h,,sizeof h);
memset(n,,sizeof n);//!
for(int i=;i<=k;i++)
scanf("%d",&n[i]);
for(int i=;i<=k;i++)
for(int j=;j<=n[i];j++)
{
h[i][j]=n[i]-j+;
int k=i+;
while(n[k]>=j)h[i][j]++,k++;
}
int t=;s1=;s2=;
for(int i=;i<=k;i++)
for(int j=;j<=n[i];j++)
{
t++;
s1*=t;s2*=h[i][j];
ll tmp=gcd(s1,s2);
s1/=tmp;s2/=tmp;
}
printf("%lld\n",s1/s2);
}
return ;
}

poj2279排队——杨氏矩阵与钩子公式(DP爆内存)的更多相关文章

  1. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

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

  3. hihocoder第238周:杨氏矩阵的个数

    题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...

  4. POJ2279杨氏矩阵+钩子定理

    题目:http://poj.org/problem?id=2279 有dp做法,但会MLE. dp的思想很好,是通过 “按身高由小到大往进放” 把 “身高小于” 的条件转化成 “放进去的先后” ,于是 ...

  5. HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)

    描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定 ...

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

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

  7. [集训]Trominoes,钩子公式运用

    题意 用这四种骨牌密铺n*m的正方形矩阵,可以不选,求方案数.n*m<=1E8.多组询问. 思考 用如上的表达难以进行计算,尝试转化为一种新的组合解释. 若从右上角开始填起,我们强制要求里面的轮 ...

  8. 杨氏矩阵:查找x是否在矩阵中,第K大数

    参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...

  9. 杨氏矩阵定义及其查找的实现C++

    先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为: 1.  每一 ...

随机推荐

  1. PLSQL怎样导出oracle表结构

    tools->export tables 是导出表结构还有数据 tools->export user objects是导出表结构   可以用tools->export tables ...

  2. linearLayout 和 relativeLayout的属性区别

    LinearLayout和RelativeLayout 共有属性: java代码中通过btn1关联次控件 android:id="@+id/btn1" 控件宽度 android:l ...

  3. python学习(十)赋值、表达式、if、while、for

    明天以搞定这几个应该不难 赋值.表达式.if.while.for 函数.作用域.参数.函数高级话题 迭代和解析一.二 还有我的<30天自制操作系统>没看 #!/usr/bin/python ...

  4. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. python 基础 9.3 mysql 数据操作

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/21 0:20 #@Auther :liuzhenchuan #@File   :mysql 数据操作 ...

  6. UFLDL教程

    http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B

  7. Project Structure 讲解(转)

    项目的左侧面板 项目设置->Project Project Settings -> Modules Sources面板 Paths面板 dependencies面板 Project Set ...

  8. iOS怎样获取任何App的资源图片?

    1.打开iTunes,并与手机相连接 2.按照下图所示执行搜索并下载App 3.到Mac的 /Users/apple/Music/iTunes/iTunes Media/Mobile Applicat ...

  9. 经常遇到js的面试题

    大家都知道在面试的时候,很多前端的必须要问的就是js的问题,最近我们公司也有很多这样的面试,我提了一些个问题,还有我面试的时候面试官面试我的问题汇总,也有百度的别人的,希望对那些刚进入这个行业的有一些 ...

  10. 关联android-support-v4源码关联不上的解决办法

    在android项目中查看android-support-v4中的源码提示“Android Private Libraries which does not modified source attac ...