题目: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. easyNetq demo

    本demo包含一个类库,2个console程序 1.新建类库  MQHelper,控制台程序  consumer和proc ,控制台程序引用MQHelper 2.使用nuget安装easynwtq 和 ...

  2. intellij 开发webservice

    最近项目中有用到WebService,于是就研究了一下,但是关于intellij 开发 WebService 的文章极少,要不就是多年以前,于是研究一下,写这篇博文.纯属记录,分享,中间有不对的地方, ...

  3. C#的类型列表

    以下是 C# 内建类型的列表: 类型 字节 描述 unsigned byte signed byte signed short unsigned short signed integer unsign ...

  4. mongo的时间类型,erlang中对其的处理

    需求:要想在一个调度中,从mongo中查出大于一个时间戳的所有的数据总和. 这个需求很简单,一个是scheduler,还有另一个就是查出来大于某个时间戳的总和,比如大于每天0点时间点的和. 需要注意的 ...

  5. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...

  6. Unity3D 动态地创建识别图

    前面介绍了EasyAR的单图识别,它是提前在Unity设置好图片路径的,那么如果我们的图片是存储在服务器上的,那么我们肯定不能直接把服务的图片地址填上去了.这个时候我们可以动态地创建识别图.步骤如下: ...

  7. python入门常用方法(转json,模拟浏览器请求头,写入文件)

    转json import jsonjson = json.loads(html) 模拟浏览器请求头 import urllib.request req = urllib.request.Request ...

  8. 网卡配置bond

    在实际的生产环境中,服务器都需要配置bond环境的,以提高安全性及均衡能力.我公司网卡配置的是mode=1 类型,mode=1 是主备模式,当其中一块网卡不能工作时,另一块网卡立即代替.以下是mode ...

  9. There are two different types of export, named and default

    export - JavaScript | MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statemen ...

  10. LeetCode——Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...