poj2279 Mr. Young's Picture Permutations[勾长公式 or 线性DP]
做了lyd书dp这一章的第一题,就不会qwq。。果然菜的人还是永远菜啊,注定翻不了身。
lyd的书上讲到了dp的方法,不是很理解。后来想通了,发现自己想的时候也想到了这一点转化,但是又很快把他抛弃掉了。。冏。
上面所谓的转化就是说,我本来安排人去排列,是无序的,显然也不好dp,因为高度不定,选了哪些也不知道,对后续状态有影响,所以要转化为有序的dp。有没有觉得很熟悉?BZOJ1079[SCOI2008]着色方案[组合计数DP]这里就是将无序的排列改为有序的插入。
对于要求从前面的一些状态中有条件限制的转移,当条件不易表达时,尝试将无序选择转化为有序的顺次选择简化之。
为什么顺序插入身高是对的?假设我已经插入$i$个身高最矮的人,那么身高$i+1$的人除了插入每一行的末尾别无选择,试想如果插在排好的队中,显然不单调。和末尾空了一格或多格站,那么中间就找不到合适身高的人站进去了。当然也要保证插入的行的当前人数少于上一行的,不然上一行会比这一行少空位,之后身高更高的人也没办法站上去。这样做完,就可以保证排列方案满足要求。有没有什么方案不能通过上面这种方案构造出来的?没有,因为不按上面那种插入的话,其他情况必然无解。所以对于每一种可行方案,我可以认为他是按从小到大身高顺序每个依次在某一行末尾插入的得到的。那么我就可以顺理成章设f[a][b][c][d][e]来记录状态了,然后就是lyd书上的做法。对于每个状态,去推出其他可以拓展的后续状态(在这题也就是再插入身高排名下一位的人)。
实现上dp数组开满会爆内存,可以采用动态开数组(说白了就是主函数内部根据大小开数组),或者f[31][16][11][8][7]也可以,为什么您们都看得出来。。然而前者速度吊打后者,因为是动态开的嘛,后者每次还要全部清空。
其他一些细节(比如不满5行怎么办)看code,也可以照例解决,就把空的几行看成数组下标是0即可。
另:勾长公式挂在标题上是摆设。。我不太想学,因为有点冷门,而且应当不会考这玩意儿的说。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int p=;char c;while(!isdigit(c=getchar()))if(c=='-')p=;
while(isdigit(c))x=x*+(c&),c=getchar();return p?x=-x:x;
}
int x[];
int n;
int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
while(read(n),n){
memset(x,,sizeof x);
for(register int i=;i<=n;++i)read(x[i]);
unsigned int f[x[]+][x[]+][x[]+][x[]+][x[]+];
memset(f,,sizeof f);
f[][][][][]=;
for(register int a=;a<=x[];++a)
for(register int b=;b<=x[];++b)
for(register int c=;c<=x[];++c)
for(register int d=;d<=x[];++d)
for(register int e=;e<=x[];++e){
f[a+][b][c][d][e]+=f[a][b][c][d][e];
if(b<a)f[a][b+][c][d][e]+=f[a][b][c][d][e];
if(c<b)f[a][b][c+][d][e]+=f[a][b][c][d][e];
if(d<c)f[a][b][c][d+][e]+=f[a][b][c][d][e];
if(e<d)f[a][b][c][d][e+]+=f[a][b][c][d][e];
}
printf("%u\n",f[x[]][x[]][x[]][x[]][x[]]);
}
return ;
}
poj2279 Mr. Young's Picture Permutations[勾长公式 or 线性DP]的更多相关文章
- POJ2279 Mr Young's Picture Permutations
POJ2279 Mr Young's Picture Permutations 描述: 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前.学生身高依次是1… ...
- 【题解】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 ...
- 轮廓线DP:poj 2279 Mr. Young's Picture Permutations
poj 2279 Mr. Young's Picture Permutations \(solution:\) 首先摘取一些关键词:(每行不超过它后面的行)(每排学生安排高度从左到右减少)(学生的高度 ...
- bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- 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从 ...
随机推荐
- KVM虚拟化网络管理(4)
一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源.第一节中我们创建了一个名为br0的linux-bridge网桥,如果在此网桥上新建一台vm,如下图: V ...
- 针对yarn的8088端口攻击
参考: https://www.wangbokun.com/%E8%BF%90%E7%BB%B4/2019/09/02/%E6%8C%96%E7%9F%BF%E7%97%85%E6%AF%92.htm ...
- java 实现读取某个目录下指定类型的文件
我这里是读取txt类型的文件,在指定的目录下有不同类型的文件 实现代码,读取txt类型的文件并打印出该文件的绝对路径 package com.SBgong.test; import java.io.F ...
- ioctl接口内容操作
int ioctl( int fd, int request, .../* void *arg */ ) 详解 第三个参数总是一个指针,但指针的类型依赖于request 参数.我们可以把和网络相关的请 ...
- FFmpeg4.0笔记:封装ffmpeg的解码功能类CDecode
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDecode.h /********************** ...
- ORM中的锁和事务
锁 sql语句加锁 select * from book where id=1 for update; begin; start transaction; select * from t1 where ...
- CVE-2018-18955漏洞学习
简介 这是名称空间的漏洞,文章先介绍user namespaces的简单只是,然后从补丁入手,分析源码,找到漏洞出现的原因.因为对这块的源码不是那么熟悉,所以着重描述源码分析的部分,其他可以参考末尾的 ...
- python基础之函数进阶
假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bi ...
- GridView中点击某行的任意位置就选中该行
GridView中点击某行的任意位置就选中该行 -- :: 分类: 第一步:添加选择列 点击GridView右边小尖头,双击CommandField,选中"选择",添加,将起设置为不可见: 第二步:处 ...
- nginx入门,安装
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...