题目: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. HTML5 2D平台游戏开发#3冲刺

    断断续续地把Demo又写了一阵,终于把角色的冲刺动作完成了.冲刺的作用是使角色能够快速移动,闪避攻击或障碍.其完成效果如下: 首先,仍需要一些变量来表示角色的冲刺状态: //标识角色是否处于冲刺中 v ...

  2. Selenium学习(三)Selenium总是崩溃的解决办法

    在使用selenium打开浏览器总是崩溃,最近查资料获得可行的解决办法: import sys from selenium import webdriver p = __import__('selen ...

  3. centOS中如何修改运行级别!

    在图形化界面可以用Ctrl+Alt+F2进入命令行窗口 * 假如你使用了虚拟机,有可能会出现不能进去的问题,原因是因为热键冲突 * 解决办法:修改热键就行了 edit→parameter→hot ke ...

  4. mnesia的脏读和事物读的测试

    在mnesia中,有脏读脏写等以及事物读写,它们的差异通过测试不难发现: 代码如下: -module(mnesia_read_test). -compile(export_all). -record( ...

  5. EF6&EFCore 注册/使用实体类的正确姿势

    首先回顾下EF中常规使用流程 1.新建实体类以及实体配置(data annotation或fluent api) [Table("Users")] public class Use ...

  6. CI去掉 URL 中的 index.php

    首先,你要清楚自己的 Web 服务器是 Apache,支持 mod_rewrite 查找httpd.conf中是否开启了mod_rewrite.so 然后,在 CI 根目录下新建立一个配置文件,命名为 ...

  7. python 基础 5.1 python 构造器

    一. 类的构造器 __init__ 构造函数,在生成对象时调用.由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.通过定义一个特殊的__init__方法, ...

  8. LoadRunner性能测试过程/流程

    用LoadRunner进行负载测试的流程通常由五个阶段组成:计划.脚本创建.场景定义.场景执行和结果分析.(1)计划负载测试:定义性能测试要求,例如并发用户的数量.典型业务流程和所需响应时间.(2)创 ...

  9. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...

  10. Mybatis中resultMap的基础配置

    一.概述 resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的 ...