poj2279排队——杨氏矩阵与钩子公式(DP爆内存)
题目: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 ;
}
然后看到了“杨氏矩阵”与“钩子公式”。
转载:
#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爆内存)的更多相关文章
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...
- 【杨氏矩阵+勾长公式】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 ...
- hihocoder第238周:杨氏矩阵的个数
题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...
- POJ2279杨氏矩阵+钩子定理
题目:http://poj.org/problem?id=2279 有dp做法,但会MLE. dp的思想很好,是通过 “按身高由小到大往进放” 把 “身高小于” 的条件转化成 “放进去的先后” ,于是 ...
- HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)
描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定 ...
- bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- [集训]Trominoes,钩子公式运用
题意 用这四种骨牌密铺n*m的正方形矩阵,可以不选,求方案数.n*m<=1E8.多组询问. 思考 用如上的表达难以进行计算,尝试转化为一种新的组合解释. 若从右上角开始填起,我们强制要求里面的轮 ...
- 杨氏矩阵:查找x是否在矩阵中,第K大数
参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...
- 杨氏矩阵定义及其查找的实现C++
先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为: 1. 每一 ...
随机推荐
- 【Python】IDLE启动错误
启动IDLE时报Subprocess Startup Error错误 错误信息 IDLE's subprocess didn't make connection.Either IDLE cant't ...
- VMware 中安装Centos
1,在百度软件中心下载VM12 http://rj.baidu.com/soft/detail/13808.html?ald 2,一路NEXT安装,安装完之后需要秘钥激活. VMware Workst ...
- C#抓取网面上的html内容(JS动态生成的无法抓取)
抓取内容的代码: /// </summary> /// <param name="url">路径URL</param> /// <para ...
- Awesome Vue.js vue.js学习资源链接大全 中文
https://blog.csdn.net/caijunfen/article/details/78216868
- 关于 Delphi 中流的使用(7) 压缩与解压缩(TCompressionStream、TDecompressionStream)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- ICMP控制报文协议
1.引言 ICMP经常被认为是IP层的一个组成部分.它传递差错以及其他需要注意的信息.ICMP报文通常被IP层或更高层 协议(TCP或UDP)使用.一些ICMP报文把差错报文返回给用户进程.ICMP报 ...
- 九度OJ 1147:Jugs(罐子) (模拟、游戏)
时间限制:1 秒 内存限制:32 兆 特殊判题:是 提交:243 解决:200 题目描述: In the movie "Die Hard 3", Bruce Willis and ...
- python数据分析之Pandas:基本功能介绍
Pandas有两个主要的数据结构:Series和DataFrame. Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签构成.来看下它的使用过程 In [1]: from ...
- LeetCode 017 4Sum
[题目] Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ...
- C ~ 指针的运算
一 :取地址运算“&”与取内容运算“*”: 单目运算“&”是取操作对象的地址 , “*”是取指针指向的对象的内容 , 两者互为逆运算 int x , *p ; p = &x ; ...