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 或 杨氏三角 和 钩子公式的更多相关文章
- poj2279排队——杨氏矩阵与钩子公式(DP爆内存)
题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...
- 线性DP详解
顾名思义,线性DP就是在一条线上进行DP,这里举一些典型的例子. LIS问题(最长上升子序列问题) 题目 给定一个长度为N的序列A,求最长的数值单调递增的子序列的长度. 上升子序列B可表示为B={Ak ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- 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门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
随机推荐
- 778A String Game
A. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- 深浅copy和字符串细节方法
copy a=[1,2,3]b=aid(a)55499272id(b)55499272 id()就是查看内存地址,是不是同一个对象. c=a.copy()id(c)57940040 可见copy()出 ...
- PHP学习笔记(一)
1.什么是 PHP? PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名) PHP 是一种服务器端的脚本语言,类似 ASP PHP 脚本在服务 ...
- mysqli_query数据库有数据,查不出来
MySQLDB.class.php <?php /** * 数据库操作工具类 */ class MySQLDB { // 定义相关属性 private $host;// 主机地址 private ...
- ApplicationContext(七)Message 源
ApplicationContext(七)Message 源 本节则是初始化消息资源池,对国际化的支持.暂时先略过. 每天用心记录一点点.内容也许不重要,但习惯很重要!
- mongoDB(Linux)
启动 service mongod start 安装好后,输入mongo进入控制台 创建数据库 use baseName db.createCollection("game_record& ...
- 微信小程序bug
2017-11-21 微信movable-view有bug,它不能在style里面设置z-index,一旦设置了,不是层间的元素就会有干扰,比如我移动0层的movable-view,但是1层的mova ...
- 三大框架中各种xml的存放位置
web.xml中classpath:和classpath*: 有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar ...
- 实现WireCard支付
实现WireCard支付,暂未完成 WireCardController.cs using System; using System.Collections.Generic; using System ...
- 用windows计划任务执行一些内容的写法,
用windows计划任务执行一些内容的写法, 以下示例: 1.创建ws对象 2.关闭java进程 3.执行bat文件 start.vbe文件内容 set ws=wscript.createobject ...