poj1037 [CEOI 2002]A decorative fence 题解
---恢复内容开始---
题意:
t组数据,每组数据给出n个木棒,长度由1到n,除了两端的木棒外,每一根木棒,要么比它左右的两根都长,要么比它左右的两根都短。即要求构成的排列为波浪型。对符合要求的排列按字典序(从左到右,从低到高)进行排序,求排列序号为c的排列。

刚拿到这道题时,也是一脸懵逼,感觉起来要用dp,但又不知道从哪里去下手。在网上搜了一下才大概明白。
我们可以先定义状态f[i]表示第i个木棒的合法方案数,我们考虑去转移,怎么从f[i-j]转移到f[i]呢?我们就要考虑第i-j个木棒的长度以及第i个木棒的长度关系,我们把下降的方案称为down,上升的称为up,我们将i根木棒构成的合法集合称为S(i)。
我们在选定x作为第一根木棒之后,去选择第二个木棒y,此时我们要去考虑x,y的长度关系,而在选定y之后我们又要考虑y和下一根木棒长度的关系,并且当方案不符合时我们也不便于去重新选择,此时我们的方程很难进行转移。
我们便可以考虑在此基础上进行细化f[i]=f[i][k] (k=1....i)
我们再定义状态f[i][j]表示集合S(i)中以第j短的木棒为第一个的方案数那么我们便可以写出状态转移方程
f[i][j]= \(\sum_{m=j}^p\) f[i][m] (down) + \(\sum_{n=1}^q\) f[i][n] (up) (p=i-1,q=j-1)
我们发现这个方程仍然不好转移,因为它还是没有拜托前面的约束。我们便可在问题上再进行细分
f[i][j]=f[i][j][down]+f[i][j][up]
f[i][j][[down]表示i根木棒以第j短的木棒为首的下降方案数,我们再去考虑状态转移方程
f[i[[j][down]= \(\sum_{n=1}^q\)f[i-1][n][up]
f[i[[j][up]= \(\sum_{m=j}^p\)f[i-1][m][down]
(p=i-1,q=j-1)
至此我们可以得出一个技巧,当在做dp类型的题目时,状态不好进行转移时我们可以在此基础上增加一维,如blocks,便于转移
至此问题还并没有得到解决,题目要求序列为c的方案,那么我们又改如何去求到呢?我们考虑以第1短的木棒为第一个的方案p(1),若c>p(1)则说明c不在p(1)之中,c减去p(1),我们再去考虑p(2),若还大于,则类推,当c<=p(k)时我们便可确定c在以第k短的木棒为第一根的集合内,我们再去考虑第二根,以此类推下去,求得解。
代码
#include<bits/stdc++.h>
using namespace std;
int T,n,used[25];
long long f[25][25][2],c;//0->up,1->down
void sta(int n){
memset(f,0,sizeof(f));
f[1][1][0]=f[1][1][1]=1;
for(int i=2;i<=n;++i){
for(int j=1;j<=i;++j){
for(int M=j;M<i;++M) f[i][j][0]+=f[i-1][M][1];
for(int N=1;N<j;++N) f[i][j][1]+=f[i-1][N][0];
}
}
}
void print(int n,long long cc){
long long jump=0;
int a[25];
memset(used,0,sizeof(used));
for(int i=1;i<=n;++i){
long long tmp=jump;
int k,p=0;
for(k=1;k<=n;++k){
tmp=jump;
if(!used[k]){
++p;
if(i==1) jump+=f[n][p][1]+f[n][p][0];
else{
if(k>a[i-1]&&(i<=2||a[i-2]>a[i-1])) jump+=f[n-i+1][p][1];
if(k<a[i-1]&&(i<=2||a[i-2]<a[i-1])) jump+=f[n-i+1][p][0];
}
if(jump>=cc) break;
}
}
used[k]=1;
a[i]=k;
jump=tmp;
}
for(int i=1;i<=n;++i){
printf("%d ",a[i]);
if(i==n) printf("\n");
}
}
int main(){
scanf("%d",&T);
sta(20);
while(T--){
scanf("%d %lld",&n,&c);
print(n,c);
}
return 0;
}
---恢复内容结束---
poj1037 [CEOI 2002]A decorative fence 题解的更多相关文章
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- POJ1037 A decorative fence 【动态规划】
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6489 Accepted: 236 ...
- A decorative fence
A decorative fence 在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i- ...
- 【POJ1037】A decorative fence(DP)
BUPT2017 wintertraining(15) #6C 题意 给长度n的数列,1,2,..,n,按依次递增递减排序,求字典序第k小的排列. 题解 dp. up[i][j]表示长度为j,以第i小 ...
- $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$
Poj AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...
- poj 1037 A decorative fence
题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...
- OpenJ_Bailian - 1037 A decorative fence
Discription Richard just finished building his new house. Now the only thing the house misses is a c ...
- usaco 2002 月赛 Fiber Communications 题解
Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...
- POJ1821 Fence 题解报告
传送门 1 题目描述 A team of $k (1 <= K <= 100) $workers should paint a fence which contains \(N (1 &l ...
随机推荐
- JS节流和防抖函数
一. 实现一个节流函数 // 思路:在规定时间内只触发一次function throttle (fn, delay) { // 利用闭包保存时间 let prev = Date.now() re ...
- 个人使用的lilypond第一个模板
手残非要用lilypond打谱真是…… 可是lilypond又能满足各种细节标记和谱文混排,这是musescore达不到的 所以还是开这个坑,希望能逐渐自己有能力编写自己的音乐教材 个人用Fresco ...
- luogu1220_关路灯 区间dp
传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...
- Tomcat源码分析 (一)----- 手写一个web服务器
作为后端开发人员,在实际的工作中我们会非常高频地使用到web服务器.而tomcat作为web服务器领域中举足轻重的一个web框架,又是不能不学习和了解的. tomcat其实是一个web框架,那么其内部 ...
- 让techempower帮你通讯服务框架的性能
在编写服务应用框架的时候一般都需要进行性能测试,但自己测试毕竟资源受限所以很难做更高性能上的测试.其实GitHub上有一个项目可以让开发人员提交自己的框架服务代码然后进行一个标准测试:现在已经有上百个 ...
- 【游记】NOIP2019复赛
声明 我的游记是一个完整的体系,如果没有阅读过往届文章,阅读可能会受到障碍. ~~~上一篇游记的传送门~~~ 前言 (编辑中)
- 轻量级移动端类库,大小20多k,支持多指触摸。
/* * 移动端 公共类库 * 作者:hqs */ (function(global, factory) { // cmd commonjs if (typeof module === "o ...
- macOS 下的 MySQL 8.0.17 安装与简易配置
如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...
- Linux之vim详解
第一次使用vim,啥都不懂,输入也不能输入,退出也不会退出,特别的尴尬....后来慢慢的接触学习,发现vim真的挺好用的,不过上手有点慢,多用就对了,用多了我相信你也会喜欢这个文本编辑工具的 一.vi ...
- 欢迎加入我的知识星球:C语言解惑课堂
我在知识星球上开通了一个有关C语言基础答疑解惑的星球,它叫做:“C语言解惑课堂”.看这名字你就知道虽然有点俗,俗才贴近你的真正需求嘛!这是一个专门帮助C语言初学者答疑解惑的课堂.嗯~~~,关于这个星球 ...