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> ...
随机推荐
- python使用sqlite
摘自python帮助文档 一.基本用法 import sqlite3 conn = sqlite3.connect('example.db')#conn = sqlite3.connect(':mem ...
- 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...
- 04. pt-deadlock-logger
死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象:当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成.上面是死锁的概念,而在MySQL ...
- Linux快速安装apache+mysql+php环境
yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-postgresql ph ...
- django admin管理后台中文添加问题
django版本号 1.7.8 #create database mydb character set utf8;#django-admin.py startproject mysite#设置sett ...
- VS2010插件 VS.PHP 调试开发php程序
VS 插件VS.PHP 调试PHP的方法;不得不说vs强大啊,此断点调试功能在zend都做不到 如图: 设置成功之后,就可以像调试 .Net程序一样试调Php程序了! 调试的步骤: 1.在需要调试的地 ...
- jvm运行机制和volatile关键字详解
参考https://www.cnblogs.com/dolphin0520/p/3920373.html JVM启动流程 1.java虚拟机启动的命令是通过java +xxx(类名,这个类中要有mai ...
- Mac OS X下安装Python的MySQLdb模块【终结版】
1.下载源文件: https://pypi.org/project/MySQL-python/ 2.cd 到源文件所在目录: 3.在目录下使用 python setup.py install 命令安装 ...
- Hadoop3集群搭建之——hive添加自定义函数UDTF
上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...
- vueJs的简单入门以及基础语法
1-1基本数据绑定 <div id="app"> {{ msg }} </div> //script new Vue({ el:"#app&quo ...