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

本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会

这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了POJ2779

杨氏矩阵和勾长公式

杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:

(1)如果格子(i,j)没有元素,则它右边和上边的相邻格子也一定没有元素。

(2)如果格子(i,j)有元素a[i][j],则它右边和上边的相邻格子要么没有元素,要么有元素且比a[i][j]大。

1 ~ n所组成杨氏矩阵的个数可以通过下面的递推式得到:

如图就是n=3时的杨氏矩阵。

 

下面介绍一个公式,那就是著名的钩子公式。

对于给定形状,不同的杨氏矩阵的个数为:n!除以每个格子的钩子长度加1的积。其中钩子长度定义为该格子

右边的格子数和它上边的格子数之和。

钩子公式:res=n!  /  (hock[1]*hock[2]*.....hock[n]);

hock[i]=在其上方和右方的所有个数+1;

reference : 咿呀而已

知道了这个就能后解出来了

奥,有一个地方要注意就是res=n!  /  (hock[1]*hock[2]*.....hock[n]);

为了防止分子或分母的越界情况,要进行单一元素的约分化简;很好理解看代码就ok

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int gcd(int a,int b)
{
return b == ? a : gcd(b,a % b);
} int d[];
int num[]; int main()
{
int n;
while(~scanf("%d",&n) && n)//行数
{
for(int i = ;i <= n;i++)
{
scanf("%d",&d[i]);//行长度
}
int tot = ;
memset(num,,sizeof(num));
//计算hock值————
long long t1,t2;
for(int i = ;i <= n;i++)//遍历行数
{
for(int j = ;j <= d[i];j++)//遍历行上的铜须
{
tot++;
num[tot] += d[i] - j + ;//应该求右面
for(int k = i + ;k <= n;k++)//和下面的看后面的同学有没有满足的
{
if(d[k] >= j)
{
num[tot]++;
}
else////如果紧靠的都没有,下面的更不会有
{
break;
} }
}
}
//代入钩子公式——互相约分一下
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 ;
}
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int gcd(int a,int b)
{
return b == ? a : gcd(b,a % b);
} int d[];
int num[]; int main()
{
int n;
while(~scanf("%d",&n) && n)//行数
{
for(int i = ;i <= n;i++)
{
scanf("%d",&d[i]);//行长度
}
int tot = ;
memset(num,,sizeof(num));
//计算hock值————
long long t1,t2;
for(int i = ;i <= n;i++)//遍历行数
{
for(int j = ;j <= d[i];j++)//遍历行上的铜须
{
tot++;
num[tot] += d[i] - j + ;//应该求右面
for(int k = i + ;k <= n;k++)//和下面的看后面的同学有没有满足的
{
if(d[k] >= j)
{
num[tot]++;
}
else////如果紧靠的都没有,下面的更不会有
{
break;
} }
}
}
//代入钩子公式——互相约分一下
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 ;
}

POJ2779 线性DP 或 杨氏三角 和 钩子公式的更多相关文章

  1. poj2279排队——杨氏矩阵与钩子公式(DP爆内存)

    题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...

  2. 线性DP详解

    顾名思义,线性DP就是在一条线上进行DP,这里举一些典型的例子. LIS问题(最长上升子序列问题) 题目 给定一个长度为N的序列A,求最长的数值单调递增的子序列的长度. 上升子序列B可表示为B={Ak ...

  3. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  4. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  5. hdu1712 线性dp

    //Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...

  6. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  7. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  8. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  9. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

随机推荐

  1. Luogu 2575 高手过招-SG函数

    Solution SG函数跑一遍就过了ouo Code #include<cstring> #include<cstdio> #include<algorithm> ...

  2. 06. pt-duplicate-key-checker

    | t01 | CREATE TABLE `t01` ( `pkid` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT ...

  3. django DEBUG=False

    在django的settings中. 将DEBUG 设置为False. 会出现 #python manage.py runserver 8888 CommandError: You must set ...

  4. DP:0

    小故事: A * "1+1+1+1+1+1+1+1 =?" * A : "上面等式的值是多少" B : *计算* "8!" A *在上面等式 ...

  5. PHP图片处理库Grafika详细教程

    转载自51CTO 开发频道 1.图像基本处理:http://developer.51cto.com/art/201611/520928.htm 2.图像特效处理模块:http://developer. ...

  6. swift 官方获取JSON 数据方法

    var url = NSURL(string: "http://www.weather.com.cn/data/sk/101120501.html") var data = NSD ...

  7. Ionic学习

    1. 原来Http不能直接加在普通类里,下面的报错 import { Component } from '@angular/core'; import { NavController } from ' ...

  8. jmeter脚本录制的两种方式

    完成一次完整的性能测试: 1.创建用户: 2.选择协议(HTTP) 3.使用工具去模拟协议操作(1.手工编写(抓包工具):2.工具自带录制) 4.运行工具进行压力测试

  9. Hibernate学习笔记:注解@OneToMany和@ManyToOne的单独使用问题 不成对使用

    以某个实际场景为例,现在两张表:用户表User 订单表Order:很显然用户对订单是一对多的关系.二者注解如下 用户表User @Entity @Table(name="users" ...

  10. Win8.1无法安装更新,提示0x800*****错误的解决方法

    Win8.1无法安装更新,提示0x800*****错误的解决方法   注:本教程同样适用于Win10系统 有时候Win8.1某个系统文件的损坏会导致无法安装Windows更新,表现为Windows更新 ...