POJ2279 Mr Young's Picture Permutations
POJ2279 Mr Young's Picture Permutations
描述: 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前。
学生身高依次是1…N。在合影时候要求每一排从左到右递减,每一列从后面到前也递减,一共有多少总方案
输入
每组测试数据包含两行。第一行给出行数k。第二行包含从后到前(n1,n2,…,nk)的行的长度,作为由单个空格分隔的十进制整数。
问题数据以0结束。
N<=30, k<=5;
输出 输出每组数据的方案数
样例输入
1
30
5
1 1 1 1 1
3
3 2 1
4
5 3 3 1
5
6 5 4 3 2
2
15 15
0
样例输出
1
1
16
4158
141892608
9694845
- 法一: dp
用一个k元组来表示每一行已经确定的人数即可描述一个状态,进行转移即可。
tip:从本题中可知,设计动态规划的状态转移方程不一定要以如何计算出一个状态的形式给出,也可以考虑用一个已知的状态更新后续阶段的状态
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
long long dp[][][][][];//空间注意计算,否则会开爆(31,31/2,31/3...)
//f(a1,a2,a3,a4,a5)表示第i层有a[i]个人时的方案数
int k,num[];
int main()
{
while(scanf("%d",&k) && k)
{
memset(dp,,sizeof(dp));
memset(num,,sizeof(num));
for(int i= ; i<=k ; i++) scanf("%d",&num[i]);
dp[][][][][]=;
for(int i= ; i<=num[] ; i++)
{
for(int j= ; j<=num[] ; j++)
{
for(int k= ; k<=num[] ; k++)
{
for(int l= ; l<=num[] ; l++)
{
for(int p= ; p<=num[] ; p++)
{
if(i+<=num[])
dp[i+][j][k][l][p]+=dp[i][j][k][l][p];
if(j+<=num[]&&j<i)
dp[i][j+][k][l][p]+=dp[i][j][k][l][p];
if(k+<=num[]&&k<j&&k<i)
dp[i][j][k+][l][p]+=dp[i][j][k][l][p];
if(l+<=num[]&&l<k&&l<j&&l<i)
dp[i][j][k][l+][p]+=dp[i][j][k][l][p];
if(p+<=num[]&&p<l&&p<k&&p<j&&p<i)
dp[i][j][k][l][p+]+=dp[i][j][k][l][p]; }
}
}
}
}
printf("%lld\n",dp[num[]][num[]][num[]][num[]][num[]]);
}
return ;
}
- 法二:(数学解法)杨氏矩阵和勾长公式
转载:巨佬博客
杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:
(1)如果格子(i,j)没有元素,则它右边和上边的相邻格子也一定没有元素。
(2)如果格子(i,j)有元素a[i][j] a[i][j]a[i][j],则它右边和上边的相邻格子要么没有元素,要么有元素且比a[i][j] a[i][j]a[i][j]大。
1 ~ n所组成杨氏矩阵的个数可以通过下面的递推式得到:如图就是n=3时的杨氏矩阵。
下面介绍一个公式,那就是著名的钩子公式。
对于给定形状,不同的杨氏矩阵的个数为:n!除以每个格子的钩子长度加1的积。其中钩子长度定义:每个格子右边的格子数和它上边的格子数之和。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; inline int gcd(int a,int b)
{
return (b==)?a:gcd(b,a%b);
}
int d[],num[];
int n;
int main()
{
while(scanf("%d",&n)&&n)
{
int tot=;
memset(num,,sizeof(num));
for(int i= ; i<=n ; i++) scanf("%d",&d[i]);
for(int i=n ; i>= ; i--)
for(int j= ; j<=d[i] ; j++)
{
tot++;
for(int k=i+ ; k<=n ; k++)
if(d[k]>=j) num[tot]++;
else break;
num[tot]+=d[i]-j+;
}
long long 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 ;
}
POJ2279 Mr Young's Picture Permutations的更多相关文章
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...
- poj2279——Mr. Young's Picture Permutations
Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...
- poj2279 Mr. Young's Picture Permutations[勾长公式 or 线性DP]
若干人左对齐站成最多5行,给定每行站多少个,列数从第一排开始往后递减.要求身高从每排从左到右递增(我将题意篡改了便于理解233),每列从前向后递增.每个人身高为1...n(n<=30)中的一个数 ...
- bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- 轮廓线DP:poj 2279 Mr. Young's Picture Permutations
poj 2279 Mr. Young's Picture Permutations \(solution:\) 首先摘取一些关键词:(每行不超过它后面的行)(每排学生安排高度从左到右减少)(学生的高度 ...
- Mr. Young's Picture Permutations
Mr. Young's Picture Permutations 给出一个有k列的网格图,以及每列图形的高度\(n_i\),下端对齐,保证高度递减,设有n个网格,询问向其中填1~n保证每行每列单调递增 ...
- 【杨氏矩阵+勾长公式】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 ...
- [POJ 2279] Mr. Young's Picture Permutations
[题目链接] http://poj.org/problem?id=2279 [算法] 杨氏矩阵与勾长公式 [代码] #include <algorithm> #include <bi ...
- POJ P2279 Mr. Young's Picture Permutations 题解
每日一题 day14 打卡 Analysis 五维dpf[a1,a2,a3,a4,a5]表示各排从左端起分别占了a1,a2,a3,a4,a5个人时合影方案数量然后我们枚举a1,a2,a3,a4,a5从 ...
随机推荐
- iOS开发时间控件怎么强制24小时制(小技巧)
1)当你的format格式是 NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];[dateFo ...
- RotbotFrameWork接口测试
一.添加接口测试Library 二.参数说明 三.关键字使用说明 Set Varibae: 参数化接口地址 Connect To Databse Using Custom Param: 连接数据库(需 ...
- Mysql加载本地CSV文件
Mysql加载本地CSV文件 1.系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL Mysql Workbench版本: ...
- Spring.net 在aps.net Web的配置复习
1.引入程序集Spring.Core,CommonLogging,Spring.Web 2.Web.Config的配置 <?xml version="1.0" encodin ...
- HBase批量插入的简单代码
由于项目需要从HBase里读取数据,进行MapReduce之后输出到HDFS中. 为了测试方便,我这里写了一个批量插入HBase数据的测试代码.采用的Maven工程. 打算,今后的所有用到的小测试例子 ...
- centos环境下如何导出数据库
MySQL数据库的导入导出可以用数据库备份工具mysqldump mysqldump工具是mysql自带的一个非常方便的一款小工具,存在mysql安装目录的/usr/local/mysql/bin ( ...
- [GO]gomaxprocs的使用
package main import ( "runtime" "fmt" ) func main() { n := runtime.GOMAXPROCS()/ ...
- thinkphp+memcache缓存例子
public function dailyRelays() { $history = I('post.history'); $da = new \Home\Model\DailyrelayModel( ...
- sql server锁检测
有时候系统运行老感觉效率不高,并且有时候sql还有超时的报错,但是并发量并不高.通过排查定位sql是否有执行效率问题 -- 开事务, 以保持锁 BEGIN TRAN -- 更新 update tabl ...
- 代码审查清单 Code Review
代码审查清单 常规项 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 所有的代码是否简单易懂? 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注 ...