poj 1037 A decorative fence
题目链接:http://poj.org/problem?id=1037
Description
A wooden fence consists of N wooden planks, placed vertically in a row next to each other. A fence looks cute if and only if the following conditions are met:
�The planks have different lengths, namely 1, 2, . . . , N plank length units.
�Each plank with two neighbors is either larger than each of its neighbors or smaller than each of them. (Note that this makes the top of the fence alternately rise and fall.)
It follows, that we may uniquely describe each cute fence with N planks as a permutation a1, . . . , aN of the numbers 1, . . . ,N such that (any i; 1 < i < N) (ai − ai−1)*(ai − ai+1) > 0 and vice versa, each such permutation describes a cute fence.
It is obvious, that there are many dierent cute wooden fences made of N planks. To bring some order into their catalogue, the sales manager of ACME decided to order them in the following way: Fence A (represented by the permutation a1, . . . , aN) is in the catalogue before fence B (represented by b1, . . . , bN) if and only if there exists such i, that (any j < i) aj = bj and (ai < bi). (Also to decide, which of the two fences is earlier in the catalogue, take their corresponding permutations, find the first place on which they differ and compare the values on this place.) All the cute fences with N planks are numbered (starting from 1) in the order they appear in the catalogue. This number is called their catalogue number.

After carefully examining all the cute little wooden fences, Richard decided to order some of them. For each of them he noted the number of its planks and its catalogue number. Later, as he met his friends, he wanted to show them the fences he ordered, but he lost the catalogue somewhere. The only thing he has got are his notes. Please help him find out, how will his fences look like.
Input
Each of the following K lines contains two integers N and C (1 <= N <= 20), separated by a space. N is the number of planks in the fence, C is the catalogue number of the fence.
You may assume, that the total number of cute little wooden fences with 20 planks fits into a 64-bit signed integer variable (long long in C/C++, int64 in FreePascal). You may also assume that the input is correct, in particular that C is at least 1 and it doesn抰 exceed the number of cute fences with N planks.
Output
Sample Input
2
2 1
3 3
Sample Output
1 2
2 3 1 这是一个典型的递归问题,学习动规是看北大的资料看懂的,搞了半天才搞定。
C[i][k][DOWN] 是S(i)中以第k短的木棒打头的DOWN方
案数,C[i][k][UP] 是S(i)中以第k短的木棒打头的UP方案数,第k短指i根中第k短
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int UP =; const int DOWN =;
const int MAXN = ;
long long C[MAXN][MAXN][]; //C[i][k][DOWN] 是S(i)中以第k短的木棒打头的DOWN方案数,C[i][k][UP] 是S(i)中以第k短的木棒打头的UP方案数,第k短指i根中第k短
void Init(int n) {
memset(C,,sizeof(C));
C[][][UP] = C[][][DOWN] = ;
for( int i = ;i <= n; ++ i )
for( int k = ; k <= i; ++ k ) { //枚举第一根木棒的长度
for( int M = k; M <i ; ++M ) //枚举第二根木棒的长度
C[i][k][UP] += C[i-][M][DOWN];
for( int N = ; N <= k-; ++N ) //枚举第二根木棒的长度
C[i][k][DOWN] += C[i-][N][UP];
}
//总方案数是 Sum{ C[n][k][DOWN] + C[n][k][UP] } k = 1.. n;
}
void Print(int n, long long cc)
{
long long skipped = ; //已经跳过的方案数
int seq[MAXN]; //最终要输出的答案
int used[MAXN]; //木棒是否用过
memset(used,,sizeof(used));
for( int i = ; i<= n; ++ i ) { //依次确定每一个位置i的木棒序号
long long oldVal = skipped;
int k;
int No = ; //k是剩下的木棒里的第No短的,No从1开始算
for( k = ; k <= n; ++k ) { //枚举位置i的木棒 ,其长度为k
oldVal = skipped;
if( !used[k]) {
++ No; //k是剩下的木棒里的第No短的
if( i == )
skipped += C[n][No][UP] + C[n][No][DOWN];
else {
if( k > seq[i-] && ( i <= || seq[i-]>seq[i-]))
//合法放置
skipped += C[n-i+][No][DOWN];
else if( k < seq[i-] &&
(i<= || seq[i-]<seq[i-])) //合法放置
skipped += C[n-i+][No][UP];
}
if( skipped >= cc )
break;
}
}
used[k] = true;
seq[i] = k;
skipped = oldVal;
}
for( int i = ;i <= n; ++i )
if( i < n) printf("%d ",seq[i]);
else printf("%d",seq[i]);
printf("\n");
}
int main()
{
int T,n; long long c;
Init();
scanf("%d",&T);
while(T--) {
scanf("%d %lld",&n,&c);
Print(n,c);
}
return ;
}
poj 1037 A decorative fence的更多相关文章
- OpenJ_Bailian - 1037 A decorative fence
Discription Richard just finished building his new house. Now the only thing the house misses is a c ...
- 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 ...
- poj 1037 三维dp
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7221 Accepted: 272 ...
- A decorative fence
A decorative fence 在\(1\sim n\)的全排列\(\{a_i\}\)中,只有大小交错的(即任意一个位置i满足\(a_{i-1}<a_i>a_{i+1}ora_{i- ...
- POJ1037A decorative fence(动态规划+排序计数+好题)
http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...
- POJ 1037 DP
题目链接: http://poj.org/problem?id=1037 分析: 很有分量的一道DP题!!! (参考于:http://blog.csdn.net/sj13051180/article/ ...
- $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$
Poj AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...
- POJ 1037 (计数 + DP) 一个美妙的栅栏
这道题总算勉勉强强看懂了,DP和计数都很不好想 DP部分: 称i根木棒的合法方案集合为S(i),第二根木棒比第一根长的方案称作UP方案,反之叫做DOWN方案 C[i][k][DOWN] 是S(i)中以 ...
随机推荐
- Scala学习文档-访问修饰符
在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...
- Android相关类关系
Activity Window.WindowManager View. interface----ViewManager LayoutInflater Components Activity.Serv ...
- JTA
http://blog.csdn.net/hengyunabc/article/details/19433947
- PYTHON线程知识再研习D---可重入锁
不多解释,预防普通锁不正规的获取与释放 #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time class ...
- HP的笔记本经常蓝屏崩溃 -------athr.sys
因为windows 7才新装不久,没有时间下载配置什么符号表,直接临时下载了WinDbg分析下Dump文件, Probably caused by : athr.sys ( athr+428a5 ) ...
- jquery 实现全选反选
jquery代码 $(function () { $('#inputCheck').click(function () { if ($(this).attr("checked")) ...
- Saruman's Army (POJ 3069)
直线上有N个点.点i的位置是Xi.从这N个点中选择若干个,给它们加上标记.对每一个点,其距离为R以内的区域里必须又带有标记的点(自己本身带有标记的点,可以认为与其距离为0的地方有一个带有标记的点).在 ...
- Java高级软件工程师面试考纲
如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...
- <php>PDO链接方法
<?php //定义数据源 $dsn = "mysql:dbname=mydb;host=localhost"; //$dsn = "sqlsrv:dbname=m ...
- JAVA并发实现五(生产者和消费者模式Condition方式实现)
package com.subject01; import java.util.PriorityQueue; import java.util.concurrent.locks.Condition; ...