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> ...
随机推荐
- andorid 列表视图 ListView 之ArrayAdapter
activity_ui3.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns ...
- spring+mybatis+mina+logback框架搭建
第一次接触spring,之前从来没有学过spring,所以算是赶鸭子上架,花了差不多一个星期来搭建,中间遇到各种各样的问题,一度觉得这个框架搭建非常麻烦,没有一点技术含量,纯粹就是配置,很低级!但随着 ...
- RNA测序研究现状与发展
RNA测序研究现状与发展 1 2,584 A+ 所属分类:Transcriptomics 收 藏 通常来说,某一个物种体内所有细胞里含有的DNA都应该是一模一样的,只是因为每一种细胞里所表达的R ...
- js的日期格式判断
var reg = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/; var str = (new Date).toLocaleString() ...
- ubuntu 下通过ftp命令下载文件
/*连接*/ $ ftp 192.168.180.2Connected to 192.168.180.2.Name (192.168.180.2:rivsidn): admin Password: ...
- Ubuntu安装bcmath扩展
sudo apt-get install php-bcmath
- 编程学习笔记(第三篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(3)软件开发的现状、UML扩展
一.软件开发的现状 软件领域正在发生一个巨变,特别是近几年来,软件领域正在发生翻天覆地的变化. 这一变化主要以这个云 + 端大数据, 这些是随着目前最先进的一些技术的产生而产生的. 随着这些新的技术以 ...
- 通过代理上网时,qq等应用程序连网出错
虽然现在基本上都用无线,有线宽带等,但是有时候还是避免不了通过代理上网时,于是就发生浏览器可以正常浏览网页,qq等应用程序连接出错等问题,上网搜了好长时间, 都没解决问题,后来慢慢琢磨(其实是乱 ...
- Python3实战系列之三(获取印度售后数据项目)
问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:实现第一个python程序的“Hello world!” 解决方案:新建一个项目Test,创建一个Test.py文件.在文件中实现打印出“He ...
- 1.preparation
1)Evarobot 安装 http://wiki.ros.org/Robots/evarobot/Tutorials/indigo/Evarobot%20Installation 2)PC 安装 a ...