The King’s Ups and Downs

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 582    Accepted Submission(s): 409

Problem Description
The king has guards of all different heights. Rather than line them up in increasing or decreasing height order, he wants to line them up so each guard is either shorter than the guards next to him or taller than the guards next to him (so the heights go up and down along the line). For example, seven guards of heights 160, 162, 164, 166, 168, 170 and 172 cm. could be arranged as:

or perhaps:

The king wants to know how many guards he needs so he can have a different up and down order at each changing of the guard for rest of his reign. To be able to do this, he needs to know for a given number of guards, n, how many different up and down orders there are:

For example, if there are four guards: 1, 2, 3,4 can be arrange as:

1324, 2143, 3142, 2314, 3412, 4231, 4132, 2413, 3241, 1423

For this problem, you will write a program that takes as input a positive integer n, the number of guards and returns the number of up and down orders for n guards of differing heights.

 
Input
The first line of input contains a single integer P, (1 <= P <= 1000), which is the number of data sets that follow. Each data set consists of single line of input containing two integers. The first integer, D is the data set number. The second integer, n (1 <= n <= 20), is the number of guards of differing heights.
 
Output
For each data set there is one line of output. It contains the data set number (D) followed by a single space, followed by the number of up and down orders for the n guards.
 
Sample Input
4
1 1
2 3
3 4
4 20
 
Sample Output
1 1
2 4
3 10
4 740742376475050
 
Source
 
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  6018 6017 6016 6015 6014 

一道较为基础的dp
我们可以对每个总人数n设4个状态,分别代表:
a[1][n]:1比2高且n-1比n高,即 \……\;
a[2][n]:1比2高且n比n-1高,即 \……/;
a[3][n]:2比1高且n-1比n高,即 /……\;
a[4][n]:2比1高且n比n-1高,即 /……/。
对于奇数n 不存在1、4这两种状态,
对于偶数n不存在2、3这两种状态。
(所以可以压缩为2个状态,懒得压了。。自己看着压吧)
对于每个状态a[j][i]都可以可以从a[k][i-1]得到。
我们要求解一个n人的高低序列,我们可以把n高度这个人左边插入一个合法的(i-1)长度的末端下降序列和右边插入一个合法的(n-i)长度的左端上升序列(1<=i<=n)。(同样的我们也可以在1的左右插入,结果相同)
所以我们得出一个dp式子:
(c为组合数 $c_{n-1}^{i-1}$)
  对于奇数n
  for i=1 to n 
    i为奇数
        a[2][n]+=a[1][i-1]*a[4][n-i]*c[n-1][i-1];(或 a[3][n]=a[4][i-1]*a[1][n-i]*c[n-1][i-1];插入1的做法,两者等价)
    i为偶数
                a[3][n]+=a[3][i-1]*a[3][n-i]*c[n-1][i-1];(或 a[2][n]+=a[2][i-1]*a[2][n-i]*c[n-1][i-1];)
  对于偶数 n
  for i=1 to n 
    i为奇数
        a[1][n]+=a[1][i-1]*a[3][n-i]*c[n-1][i-1];(或 a[4][n]=a[4][i-1]*a[2][n-i]*c[n-1][i-1];插入1的做法,两者等价)
    i为偶数
                 a[4][n]+=a[3][i-1]*a[4][n-i]*c[n-1][i-1];(或 a[1][n]+=a[2][i-1]*a[1][n-i]*c[n-1][i-1];)
  然后对1~4中状态求和即为答案 sum[i]。
 #include<cstdio>
#include<iostream>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
#define LL long long
using namespace std;
LL c[][];
LL a[][];
LL sum[];
void combine(int n);
void dp(int num);
int main()
{
clr(c);
clr(a);
combine();
dp();
int T,n,m;
scanf("%d",&T);
for(int tt=;tt<=T;tt++)
{
scanf("%d%d",&m,&n);
printf("%d %lld\n",m,sum[n]);
}
return ; }
void combine(int n)
{
for(int i=;i<=n;i++)
{
c[i][]=c[i][i]=;
for(int j=;j<i;j++)
{
c[i][j]=c[i][j-]*(i-j+)/j;
}
}
return ;
}
void dp(int num)
{
a[][]=a[][]=a[][]=a[][]=;
sum[]=;
sum[]=;
for(int n=;n<=num;n++)
{
if(n&)
{
for(int i=;i<=n;i++)
if(i&)
a[][n]+=a[][i-]*a[][n-i]*c[n-][i-];
else
a[][n]+=a[][i-]*a[][n-i]*c[n-][i-];
sum[n]=a[][n]+a[][n];
}
else
{
for(int i=;i<=n;i++)
if(i&)
a[][n]+=a[][i-]*a[][n-i]*c[n-][i-];
else
a[][n]+=a[][i-]*a[][n-i]*c[n-][i-];
sum[n]=a[][n]+a[][n];
}
}
return ;
}

hdu 4489 The King’s Ups and Downs(基础dp)的更多相关文章

  1. HDU 4489 The King’s Ups and Downs (DP+数学计数)

    题意:给你n个身高高低不同的士兵.问你把他们按照波浪状排列(高低高或低高低)有多少方法数. 析:这是一个DP题是很明显的,因为你暴力的话,一定会超时,应该在第15个时,就过不去了,所以这是一个DP计数 ...

  2. HDU 4489 The King's Ups and Downs

    HDU 4489 The King's Ups and Downs 思路: 状态:dp[i]表示i个数的方案数. 转移方程:dp[n]=∑dp[j-1]/2*dp[n-j]/2*C(n-1,j-1). ...

  3. HDU 4489 The King’s Ups and Downs dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4489 The King's Ups and Downs Time Limit: 2000/1000 ...

  4. HDU 4489 The King’s Ups and Downs

    http://acm.hdu.edu.cn/showproblem.php?pid=4489 题意:有n个身高不同的人,计算高低或低高交错排列的方法数. 思路:可以按照身高顺序依次插进去. d[i][ ...

  5. HDU 4055 The King’s Ups and Downs(DP计数)

    题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...

  6. UVALive 6177 The King's Ups and Downs

    The King's Ups and Downs Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UV ...

  7. The King’s Ups and Downs(HDU 4489,动态规划递推,组合数,国王的游戏)

    题意: 给一个数字n,让1到n的所有数都以波浪形排序,即任意两个相邻的数都是一高一低或者一低一高 比如:1324   4231,再比如4213就是错的,因为4高,2低,接下来1就应该比2高,但是它没有 ...

  8. The King’s Ups and Downs

    有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况. 化简为 n个人,求出可以形成波浪形状的方法数 #include <iostream> #include <cma ...

  9. hdu 4055 && hdu 4489 动态规划

    hdu 4055: 一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶: 参照他的思路和代码: #include<cstdio> #include<cstring> # ...

随机推荐

  1. 【HNOI】 小A的树 tree-dp

    [题目描述]给定一颗树,每个点有各自的权值,任意选取两个点,要求算出这两个点路径上所有点的and,or,xor的期望值. [数据范围]n<=10^5 首先期望可以转化为求树上所有点对的and,o ...

  2. SD卡 模拟SPI总线控制流程

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  3. Composer 手动安装

    Linux/Mac 环境 sudo wget -O /usr/local/bin/composer https://dl.laravel-china.org/composer.phar sudo ch ...

  4. 檢查 cpu 的全部 gpio 狀態及設定

    $ adb root # cat /sys/kernel/debug/gpio

  5. Linux内核通知链机制的原理及实现【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/11/2396781.html 一.概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其 ...

  6. Linux抓包工具tcpdump

    Linux抓包工具tcpdump http://www.xuchanggang.cn/archives/1107.html

  7. 18:django 日志系统

    django使用python内建的logging模块去建造自己的系统日志的,如果你想详细了解这个模块的话,请自己去看python的说明文档,这里仅仅介绍django中的日志系统 日志配置包括四个部分: ...

  8. linux命令(25):ln命令

    命令格式: ln [参数][源文件或目录][目标文件或目录] 必要参数: -b 删除,覆盖以前建立的链接 -d 允许超级用户制作目录的硬链接 -f 强制执行 -i 交互模式,文件存在则提示用户是否覆盖 ...

  9. Qt笔记——QSqlLite

    静态数据库,简单方便 在.pro文件里添加 +sql #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { ...

  10. 如何实现artTemplate模板的可重用性,以此框架打造自己的自定义组件

    问题的提出: 我们为什么非得要引入artTemplate来进行JSON数据的渲染呢? http://dagmom.iteye.com/blog/1671498http://bbs.csdn.net/t ...