The King’s Ups and Downs

有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况。

化简为 n个人,求出可以形成波浪形状的方法数

#include <iostream>
#include <cmath>
#include <math.h>
#include <vector>
#include <cstdio>
#include <cstring>

#include <algorithm>
#define ll long long
using namespace std;
ll dp[25][2];
ll sum[25];
ll C(ll x,ll y)
{
    ll ans = 1;
    if(x < y)
         return 0;
    else if(x == y || y ==0)
         return 1;
    else{
        for(ll i=x;i>=(x-y+1);--i){
            ans *= i;
        }
        while(y){
            ans /= y--;
        }
        return ans;
    }
}
void f()
{
    sum[1] = 1;
    sum[2] = 2;
    dp[0][0] = dp[0][1] = 1;
    dp[1][0] = dp[1][1] = 1;
    dp[2][0] = dp[2][1] = 1;

    for(int i=3;i<=20;i++)
    {
        for(int j=0;j<i;j++)
        {
            sum[i] += dp[j][0]*dp[i-j-1][1]*C(i-1,j);
        }
        dp[i][0] = dp[i][1] = sum[i]/2;
    }
}

int main()
{
    memset(dp,0,sizeof(dp));
    memset(sum,0,sizeof(sum));
    f();
    int n,m,p;
    cin>>n;
    while(n--)
    {
        cin>>m>>p;
        cout<<m<<" "<<sum[p]<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/tonyyy/p/10662466.html

时间: 2024-11-12 09:57:36

The King’s Ups and Downs的相关文章

DpUVALive 6177The King&#39;s Ups and Downs

练习赛的时候写了个爆搜,然后没跑出来 就不搞了, 田腿说用状压跑,打表.其实有能直接过的Dp吧. 下面是打表的Dp..结果除了第一个 其余乘以2就行了. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #inclu

UVA 6177 The King&#39;s Ups and Downs DP

orz想了好久好久的排列组合,未果,考虑不全--DP好难啊233333 题目链接戳这里 抛开整体不考虑,我们来考虑一下只有3个人的局部问题: 只要第i-1个人比i矮(高)第i+1个人比i矮(高),i当前位置就是满足题意的 设f[i][j]为排列的第i位为j,而且i-1位比j小 设g[i][j]为排列的第i位位j,而且i-1位比j大 emmmmm明天补 #include<bits/stdc++.h> using namespace std; typedef long long ll; const

HDU 4489 The King&#39;s Ups and Downs

题目链接 问的是n个不一样的数,大小交替,或者小大交替的种类数量. n个数,想象成[1,n]的自然数即可. 我们假设大小交替得到的长度为i的排列数为dp1[i],小大交替得到的长度为i的排列数为dp2[i],因为是对称的,其实应该有dp1=dp2,我们要计算的总和sum=dp1+dp2. 我们从小到大考虑各个数,一个个插入队列,考虑到第i个数,称为ai,ai比前i-1个数都大,可以插入的位置j∈[1,i]. ai插入的位置为j时,前面的i-1个人比自己小,选择出来排列的情况有C(i-1,j-1)

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

题意:给你n个身高高低不同的士兵.问你把他们按照波浪状排列(高低高或低高低)有多少方法数. 析:这是一个DP题是很明显的,因为你暴力的话,一定会超时,应该在第15个时,就过不去了,所以这是一个DP计数问题. 那么我们应该怎么想呢,我们先假设前 i-1 个已经放好了,然后第 i 个一定是最高的,所以,他一定要在前面找一个低后面放上他,肯定不能放在高的后面, 那么状态就有的表示了,d[i][0]表示是以低结尾,d[i][1]是以高结尾,我们假设放第 i 个士兵时,前面有 j 个,那么后面就有 i -

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

题意:国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个的情况的答案已给出. 思路:是此题HDU 4055 Number String(DP计数) 的简单版,所以看此题解就行了.数量较小,可以预先算出来.要同时考虑 <><>和><><这样的两种情况. 1 #include <iostream> 2 #inc

HDU 4489 The King’s Ups and Downs

http://acm.hdu.edu.cn/showproblem.php?pid=4489 题意:有n个身高不同的人,计算高低或低高交错排列的方法数. 思路:可以按照身高顺序依次插进去. d[i][0]表示i个人以高低结尾的方法数,d[i][1]表示i个人以低高开头的方法数. 将第i个人插入时,当它左边为j个人的时候,右边就是i-1-j,并且左边必须要以高低结尾,右边必须以低高开头.也就是d[i-1][0]*d[i-1][1].当然了,后面还得再乘c(i-1,j),表示选j个人的方法数. 1

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm