POJ 1037 (计数 + DP) 一个美妙的栅栏
这道题总算勉勉强强看懂了,DP和计数都很不好想
DP部分:
称i根木棒的合法方案集合为S(i),第二根木棒比第一根长的方案称作UP方案,反之叫做DOWN方案
C[i][k][DOWN] 是S(i)中以第k短(而不是长度为k)的木棒打头的DOWN方案数。
假设S(i)中第一根木棒长为x,那么构成合法的方案数有两类:
- S(i - 1)中第一根木棒比x长的DOWN方案
- S(i - 1)中第一根木棒比x短的UP方案
有如下递推关系:
C[i][k][UP] = ∑ C[i-1][M][DOWN]
M = k ... i -1
C[i][k][DOWN] = ∑ C[i-1][N][UP]
N = 1… k-1
举个例子:
比如四根木棒,假设第一根木棒长度为2,在剩下的1 3 4中,比2长的3和4分别是S(3)中第2和第3短的。(要和C所定义的状态相对应)
所以上式的M和N的范围就是这样的
总的方案数就是:Sum{ C[n][k][DOWN] + C[n][k][UP] } k = 1.. n
计数部分:
扔掉这个题,考虑一下这个问题:
1 2 3 4全排列,求字典序的第10个
首先假设第一个数是1,那么后面有3! = 6 < 10种排列情况,所以打头的不是1。 继续假设是2,后面三个数也有6种排列情况, 6 + 6 ≥ 10,所以第一个数确定是2,此时跳过了第一个数为1的6种情况。
继续假设第二个数是1,后面有2! = 2种情况, 2 + 6 < 10,所以假设第二个数是3(注意2已经在第一个数中用过了),依旧是有2种情况, 8 + 2 ≥ 10,第二个数确定是3,跳过了10种情况。
后面因为10 ≥ 10,所以第三第四个数分别是1 4
所求的排列就是2 3 1 4
回到这个题上来:
前面已经求得了i个数中第k小打头的方案数,所以我们也完全可以模拟上面的思维过程来求解。
微调:以第i短的木棒作第k根时,有UP和DOWN两类方案,先用DOWN的方案数和C比较
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
const int UP = ;
const int DOWN = ;
long long C[maxn][maxn][]; 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];
}
} void Print(int n, long long c)
{
long long skipped = ;
int seq[maxn], used[maxn];
memset(used, , sizeof(used));
for(int i = ; i <= n; ++i)
{
long long oldVal = skipped;
int k, No = ;
for(k = ; k <= n; ++k)
{
oldVal = 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 >= c)
break;
}
}
used[k] = ;
seq[i] = k;
skipped = oldVal;
} for(int i = ; i < n; ++i) printf("%d ", seq[i]);
printf("%d\n", seq[n]);
} int main(void)
{
#ifdef LOCAL
freopen("1037in.txt", "r", stdin);
#endif int T, n;
long long c;
Init();
scanf("%d", &T);
while(T--)
{
scanf("%d %lld", &n, &c);
Print(n, c);
}
return ;
}
代码君
POJ 1037 (计数 + DP) 一个美妙的栅栏的更多相关文章
- poj 1037 三维dp
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7221 Accepted: 272 ...
- POJ 2229 计数DP
dp[i]代表是数字i的最多组合数如果i是一个奇数,i的任意一个组合都包含1,所以dp[i] = dp[i-1] 如果i是一个偶数,分两种情况讨论,一种是序列中包含1,因此dp[i]=dp[i-1]一 ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 计数dp
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/Judge ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
随机推荐
- hadoop配置错误
经过上一周的郁闷期(拖延症引发的郁闷),今天终于开始步入正轨了.今天主要是解决hadoop配置的错误以及网络时断时续的问题. 首先说明一下之前按照这篇文章的方法配置完全没有问题,但是等我配置好了发现h ...
- iOS视频压缩
// // ViewController.m // iOS视频测试 // // Created by apple on 15/8/19. // Copyright (c) 2015年 tqh. All ...
- JAVA类型信息——Class对象
JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- <Win32_1>深入浅出windows消息机制[转自crocodile_]
上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...
- poj 3615(floyd变形)
题目链接:http://poj.org/problem?id=3615 思路:map[i][j]表示顶点i,j之间的最高的障碍物,于是题目要求的是最高障碍物的最小值,不就是min(map[i][j], ...
- Understanding node.js
Node.js has generally caused two reactions in people I've introduced it to. Basically people either ...
- ABP集合帖
http://www.cnblogs.com/kebinet/p/5341663.html http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent ...
- 数学+dp HDOJ 5317 RGCDQ
题目传送门 /* 题意:给一个区间,问任意两个数的素数因子的GCD最大 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, dp[ ...
- 两台笔记本搭建openvswitch网络
环境说明: 笔记本A.B均运行Ubuntu 14.04,两台笔记本通过无线网卡上网,用一根网线连接两台笔记本的有线网卡. 网络拓扑: 其中,vm1 vm2 S1位于笔记本A,vm3 vm4 S2位于笔 ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-007UserTypes的用法(@org.hibernate.annotations.Type、@org.hibernate.annotations.TypeDefs、CompositeUserType、DynamicParameterizedType、、、)
一.结构 二.Hibernate支持的UserTypes接口 UserType —You can transform values by interacting with the plain JD ...