DP 递推计数

题意:

这是一道比较神奇的题,很考验思维:有n个高低不同的人,现在需要进行排列,排列一定要满足两种方式

  • 高低高···

  • 低高低···

    求出有多少排列方式。

思路:

我们的切入点是第i个人,如果前i-1个人都已经排列好了,那么第i个人只需插入就行,因为任何人排列先后顺序不影响总的结果,我们就认为插入的人高度递增的,那么第i个人的高度是最高的,把他放在两端的情况有

dp[i−1]

dp[i-1] 种,重点是中间的插入情况,第i人放在中间的情况仔细分析之后有一个条件是必须要满足的那就是第i人左边的1~i-1人的排列一定是 ···高低第i人,右边的排列一定是 第i人低高··· ,因为第i人是最高的那么左右的两个人都是低谷,。加入一共有i-1人,第i人现在要插入其左边有j个人,满足上边条件的情况有

dp[j−1]>>1

dp[j-1]>>1 ,,右边有i-1-j个人,满足上述条件的人有

dp[i−1−j]>>1

dp[i-1-j]>>1 (因为开始或者结尾时低的人的情况各占总数的一半) 。那么

dp[i]+=(dp[j]>>1)∗(dp[i−1−j]>>1)∗C(j,i−1)

dp[i] += (dp[j]>>1) *(dp[i-1-j]>>1) * C(j,i-1) ,其中

C(j,i−1)

C(j,i-1) 意思是从i-1人中选拔出j人在第i人左边的种类数。

  • 注意点:当第i人左边或者右边只有一个人的情况,只需除以依次2即可。

#include <iostream>
#include <cstdio>
#include <math.h>using namespace std;typedef long long LL;
const int maxn = 30;int n;
LL dp[maxn];LL C(int m,int n)
{LL ans = 1;int t = m;while(t) {ans *= n;n--;t--;if(ans%m == 0 && m != 0) {ans /= m;m--;}}while(m) {ans /= m;m--;}return ans;
}void init()
{dp[1] = 1;dp[2] = 2;dp[3] = 4;for(int i = 4;i <= 20; i++) {dp[i] += dp[i-1];// printf("%d\n",i);for(int j = 1;j < i - 1; j++) {if(j == 1 || i - j - 1 == 1)dp[i] += (dp[j]*dp[i-j-1]>>1)*C(j,i-1);elsedp[i] += (dp[j]>>1)*(dp[i-j-1]>>1)*C(j,i-1);}}
}int main()
{//freopen("in.txt","r",stdin);init();int tt;scanf("%d",&tt);for(int i = 1;i <= tt; i++) {int ncase;scanf("%d%d",&ncase,&n);printf("%d %I64d\n",ncase,dp[n]);}return 0;
}

HDU 4489 (DP递推计数)相关推荐

  1. hdu 1723 DP/递推

    题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...

  2. Two Arrays(DP递推)

    You are given two integers nn and mm. Calculate the number of pairs of arrays (a,b)(a,b) such that: ...

  3. 动态规划入门之dp递推~

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 本篇文章重在递推,不 ...

  4. hdu 5273(递推)

    题目:给定多个询问,找到区间[l,r]的逆序数对数. 解题思路: 这道题目其实就是递推,只要找到递推公式即可.dp[i][j]表示在区间[i,j]内,逆序数的对数,则有递推式:dp[i][j] = d ...

  5. POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂

    哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种   递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种 1.放4个 1×2  则 为dp[n-2] ...

  6. BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...

  7. Power oj2498/DP/递推

    power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submit: 12 Accepted: 3 ...

  8. HDU-5965 扫雷(dp / 递推)

    传送门 扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔. 该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子可能处于己知和未知的状态.如果一个己知 ...

  9. 2019.08.20【NOIP提高组】模拟 B 组 排序、DP+递推、矩阵乘法+数位DP/类欧

    文章目录 0 旅游(travel) 1 做梦(dream) 2 数数(count) 初见时,她说,"我无力自保,无处可去,无人可依." 多年后,他说,"我教你射箭,你已有 ...

最新文章

  1. SQL对象名无效怎么办法 华骨龙
  2. jsp 特殊字符转义
  3. Linux系统中磁盘创建管理(一)
  4. 夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计
  5. centos7 kafka2.3.1单点部署
  6. 【emWin】例程十五:触摸校准实例——五点校准法
  7. sqlyog备份数据和导入备份数据
  8. 《UNIX环境高级编程(第3版)》——2.6 选项
  9. 工作中常用知识点、工具总结
  10. linux镜像文件_深度UI + Ubuntu系统,堪称最强最美Linux发行版!你敢升级吗?
  11. 初入职场,你够聪明不?
  12. Windows上安装Linux
  13. ewebeditor漏洞之目录遍历漏洞
  14. http 状态码以及http请求、响应
  15. 拼多多API接口:item_get - 根据ID取商品详情
  16. Windows与Linux的命令行命令对比
  17. JAVA开发运维(nginx工作原理)
  18. 从苏宁电器到卡巴斯基第17篇:我在苏宁电器当营业员 VIII
  19. Mac 电脑python 升级3.7版本
  20. Redis 队列好处

热门文章

  1. pdf编辑器工具哪个好?好用的pdf编辑器一款就够!
  2. GTD时间管理-节假日时间安排 | 每天成就更大成功
  3. Ubuntu lightdm无法启动解决办法
  4. 普通最小二乘法回归 - OLS (ordinary least square)
  5. IDM短信发送接口设计说明
  6. W74 - 999、云计算工程师认证
  7. 物种多样性学习 之Alpha多样性
  8. 语雀桌面端技术架构实践
  9. 图像算法工程师的一般要求
  10. led的伏安特性曲线 matlab实现_光电池伏安特性测试MATLAB制图程序