这里对于题意在说明一下, 题目中要求的排列必须是波浪形,每一个在排列中的人不是波峰就是波谷,如果它既不是波峰也不是波谷排列就是错的.

对于我这种数学渣渣来说,做一道dp题要好久,%>_<%   怎么想到的DP呢? 首先他看起来像搜素,但数据范围很大(对于深搜来说20就够大了),抱着试一试的心态用暴搜写了一下,结果在n=12是爆掉了,怎么优化慢了一倍的时间呢? 由于我剪枝能力一点都不高,然后我觉得搜素爆掉就要想dp,然后越想越觉得很对.

解题思路,假设n个人身高从1到n升序排列,我们先把题目分解成一个最小子问题,就是第n个人要插在哪里? 他前面有n-1人, 那么就有n个孔等着他插,假设他插到了第j个位置,前面有j-1人,后面有n-j人. 那么第一个式子就出来了,当第n个人在j位置时,对于这种情况的排列总数为前面j-1人的总排列数*后面n-j人的总排列数,这是不是就是很明显的dp了,求一个解必须已知其他的解,但现在其他的解没有规律无法求出,那么就找出规律来. 咱们在想,第n个人是不是一定最高,他插在j位置,他前面的那个人一定比他矮,那么第n个人前面的那个序列最后两人一定是降序排列的,我们设这种状态为0,那后面的那个序列的前面两人也一定是升序排列的,我们设为1,那么此时有dp[j][0]代表j个人最后两人是升序排列的总排列数,dp[n-j][1]代表n-j个人最前面两人是升序排列的.但是还没完,还有很重要的一点没有考虑到, 第n个人前面的j-1个人是不是不知道选谁,因为第n个人在最初排列中他前面有n-1个人这n-1中选哪几个站在第n个人前面呢? 不要考虑身高(因为对于波浪线来说总会有合适的)  这样是不是c(n-1,j-1)一下,前面的人确定了,后面的人也就随之确定了,所以就不用考虑了.

这样推到之后,有递推公式 c(n-1,j-1)*dp[j-1][0]*dp[n-j][1]  由于对称性 sum[n](n的总排列数)/2=dp[n][0]=dp[n][1],想一想对不对?

那么最终n的总排列数就等于把所有孔算完相加的值,代码如下.

#include<cstdio>
#include<cstring> using namespace std; __int64 dp[][];
__int64 answer[]; __int64 C(int x,int y) // xÊǵ×Êý
{
__int64 mother=,son=;
for(int i=;i<y;i++)
{
mother*=(y-i);
son*=(x-i);
}
return son/mother;
}
int main()
{
for(int i=;i<=;i++){
for(int j=;j<;j++)
dp[i][j]=;
}
answer[]=;
for(int i=;i<=;i++){
for(int j=;j<=i;j++){
answer[i]+=C(i-,j-)*dp[j-][]*dp[i-j][]; }
dp[i][]=dp[i][]=answer[i]/;
}
int t;
scanf("%d",&t);
while(t--)
{
int k,n;
scanf("%d%d",&k,&n);
printf("%d ",k);
printf("%I64d\n",answer[n]);
}
return ;
}

hdu4489 组合公式+dp的更多相关文章

  1. HDOJ(HDU) 2519 新生晚会(组合公式)

    Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法? I ...

  2. bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MBSubmit: 803  Solved: 372[Submit][Statu ...

  3. [ZJOI2010]排列计数 (组合计数/dp)

    [ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...

  4. hdu 1799 (循环多少次?)(排列组合公式)

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. Luogu4622 COCI2012-2013#6 JEDAN 组合、DP

    传送门 题意:给出一个$N$个数的序列$a_i$,其中$a_i=-1$表示第$i$个位置数字未知,问有多少种用非负整数代替$a_i$中$-1$的方法使得从全$0$序列经过以下操作若干次得到序列$a_i ...

  6. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  7. poj2279排队——杨氏矩阵与钩子公式(DP爆内存)

    题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...

  8. HDU - 5492 Find a path(方差公式+dp)

    Find a path Frog fell into a maze. This maze is a rectangle containing NN rows and MM columns. Each ...

  9. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

随机推荐

  1. kie-api 组件介绍

    KieServices:kie整体的入口,可以用来创建Container,resource,fileSystem等 KieContainer: KieContainer就是一个KieBase的容器,可 ...

  2. 零基础逆向工程19_PE结构03_代码节空白区添加代码_shellcode

    1.获取MessageBox地址,构造ShellCode代码 三种获取方法,参考文章末的一篇帖子. E8 E9计算公式 call 的硬编码:E8 00 00 00 00 jmp 的硬编码:E9 00 ...

  3. JavaWeb_05_xml相关&dtd快速入门

    学东西怎么学,是什么,能做什么,怎么去做!! 1.xml的简介 1.eXtensible Markup Language:可扩展标记型语言 标记型语言:html是标记型语言 也是使用标签来操作 可扩展 ...

  4. C# 使用解析json 嵌套方法

    C#从网页不传参数 接收json数据 public String GetHtmlFromUrl(String url) { //Response.Write(url); //Response.End( ...

  5. APP自动化测试

    CTS工具,主要是基于Androidinstrumentation和JUnit测试原理推单元测试用例: Monkey用来对UI进行压力测试,伪随机的模拟用户的按键输入,触摸屏输入,手势输入等: ASE ...

  6. 2013年省市区/县数据SQL Server(SQL语句)

    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[tbl_Region]( [ ...

  7. SingletonLoginUser

    package cn.com.jgt.view{ import flash.errors.IllegalOperationError; /** * actionscript类的构造方法不能是priva ...

  8. HDU - 5457 Hold Your Hand (Trie + 最小割)

    Hold Your Hand Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)T ...

  9. UVA 1442 Cave 洞穴 (贪心+扫描)

    题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...

  10. Luogu P2073 送花

    权值线段树的模板题 然而AC后才发现,可以用\(\tt{set}\)水过-- 权值线段树类似于用线段树来实现平衡树的一些操作,代码实现还是比较方便的 #include<iostream> ...