POJ1037A decorative fence(动态规划+排序计数+好题)
http://poj.org/problem?id=1037
题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个;
分析:总数为i跟木棒中第k短的木棒 就等于总数为i-1中比这一根短的方案数 + 和比这一根长的方案数;最后用一个三维数组表示成c[i][k][up/down],c[i][k][up]表示i跟木棒中第k短的下一个比他长的方案数,就可以枚举每一个比他长的数相加;
排列计数问题:求一个排列中第几个是什么?


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define UP 0
#define DOWN 1
const int MAX = ;
long long c[MAX][MAX][];
int seq[MAX],used[MAX];
void Init(int n)
{
memset(c, , sizeof(c));
c[][][UP] = c[][][DOWN] = ;
for(int i = ; i <= n; i++) //个数
{
for(int k = ; k <= i; k++) //第i短
{
for(int N = k; N < i; N++)
{
//这个循环为什么k而不是k+1开始呢?
//因为c[i][k][UP]是指以i个木棒中第k短开头的上升木棒,那么下一个的总数就是i-1,那是i-1中第几短呢,除掉前面的那个k,比他长的就是第k到i-1(除去k后,比他稍微长点的就成了第k短)
c[i][k][UP] += c[i - ][N][DOWN];
}
for(int M = ; M <= k - ; M++)
{
//这个没啥影响
c[i][k][DOWN] += c[i - ][M][UP];
}
}
}
}
void print(int n, long long cc)
{
long long skipped = ;
int No = ;
long long oldValue = skipped;
memset(used, , sizeof(used));
for(int i = ; i <= n; i++)
{
int k;
No = ;
oldValue = skipped;
for(k = ; k <= n; k++)
{
oldValue = skipped;//用oldvalue保留每一次最先开始的次数,然后skipped不断算跳跃的方案数
if(used[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) //跳跃的方案数比给定的大,那就跳出循环,如果比cc小就在改变oldvalue值
break;
}
}
used[k] = true;
seq[i] = k;
skipped = oldValue;
}
for(int i = ; i < n; i++)
printf("%d ", seq[i]);
printf("%d\n", seq[n]);
}
int main()
{
int t,n;
long long C;
Init();
scanf("%d", &t);
while(t--)
{
scanf("%d%I64d", &n,&C);
print(n, C);
}
return ;
}
POJ1037A decorative fence(动态规划+排序计数+好题)的更多相关文章
- POJ1037A decorative fence(好dp)
1037 带点组合的东西吧 黑书P257 其实我没看懂它写的嘛玩意儿 这题还是挺不错的 一个模糊的思路可能会好想一些 就是大体的递推方程 dp1[][]表示降序 dp2[][]表示升序 数组的含义为长 ...
- POJ1037 A decorative fence 【动态规划】
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6489 Accepted: 236 ...
- POJ1037 A decorative fence
题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...
- 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...
- 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$
Poj AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...
- [NOIP 2014复习]第三章:动态规划——NOIP历届真题回想
背包型动态规划 1.Wikioi 1047 邮票面值设计 题目描写叙述 Description 给定一个信封,最多仅仅同意粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定全部的邮票数量都 ...
- hdu 1106:排序(水题,字符串处理 + 排序)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
随机推荐
- swift为UIView添加extension扩展frame
添加swift file:UIView+Extension import UIKit extension UIView { // x var x : CGFloat { get { return fr ...
- 九、Foundation框架中的NSString常用方法
一.NSString的创建 方式1创建常量字符串 NSString *st = @"this is string!"; //这种方式创建的字符串不需要释放 方式2创建空字符串,给予 ...
- Java系列:《Java核心技术 卷一》学习笔记,cchapter11 异常
11.1.1 异常分类 如果一个程序出现了RuntimeException,那么就一定是你的问题. 11.1.2 声明已检测异常 如果子类覆盖了父类的一个方法,那么子类方法中声明的检查 ...
- [CareerCup] 9.2 Robot Moving 机器人移动
9.2 Imagine a robot sitting on the upper left corner of an X by Y grid. The robot can only move in t ...
- 关于ARP攻击的原理以及在Kali Linux环境下的实现
关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...
- Windows 2008如何绑定MAC防范ARP攻击!
Windows 2008如何绑定MAC防范ARP攻击! 阅读(1974)暂无评论时间:2010-11-23 22:52:13 在Windows server 2003时代,通过arp 这命令即 ...
- java <? super Fruit>与<? extends Fruit>
package Test2016; import java.util.ArrayList; import java.util.List; public class Test2016 { public ...
- JavaScript split() 方法
split() 方法用于把一个字符串分割成字符串数组.
- Gitlab的develop角色的人没有权限无法提交的问题解决方案
问题 事情是这样的,最近跟几位同事搞一些东西,打算在Gitlab上建一个仓库,然后协同开发. 我建好仓库,将其他几位同事添加进来,角色分配为Develop. 之后提交初始代码到master分支后,他们 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...