UVA 题目10128 Queue(DP)

原创 2015年11月18日 11:03:42
There is a queue with N people. Every person has a different heigth. We can see P people, when we
are looking from the beginning, and R people, when we are looking from the end. Its because they
are having different height and they are covering each other. How many different permutations of our
queue has such a interesting feature?
Input
The input consists of T test cases. The number of them (1 ≤ T ≤ 10000) is given on the first line of
the input file.
Each test case begins with a line containing a single integer number N that indicates the number
of people in a queue (1 ≤ N ≤ 13). Then follows line containing two integers. The first integer
corresponds to the number of people, that we can see looking from the beginning. The second integer
corresponds to the number of people, that we can see looking from the end.
Output
For every test case your program has to determine one integer. Print how many permutations of N
people we can see exactly P people from the beginning, and R people, when we are looking from the
end.
Sample Input
3
10 4 4
11 3 1
3 1 2
Sample Output
90720
1026576

1

题目大意:n个高低不同的人排队,从前边看有m个人,从后边能看到r个人。问有多少种站法

思路:dp[i][j][k]表示i个人,从前边看j个,从后边看k个的排法种类数,把最矮的放在前边j+1(谁都挡不住),放在最后边k+1,(谁都挡不住),放在中间任意一个位置,j,k不变,于是递推公式dp[i][j][k]=dp[i-1][j-1][k]+dp[i-1][j][k-1]+(i*2)*dp[i-1][j][k]

ac代码

16452698 10128 Queue Accepted C++ 0.003 2015-11-18 02:59:23

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
LL dp[22][22][22];
void fun()
{
    int i,j,k;
    dp[1][1][1]=1;
    for(i=2;i<=13;i++)
    {
        for(j=1;j<=i;j++)
        {
            int r=i-j+1;
            for(k=1;k<=r;k++)
            {
                dp[i][j][k]=dp[i-1][j][k-1]+dp[i-1][j-1][k]+(i-2)*dp[i-1][j][k];
            }
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    fun();
    while(t--)
    {
        int n,m,r;
        scanf("%d%d%d",&n,&m,&r);
        printf("%lld\n",dp[n][m][r]);
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva540 Team Queue(模拟:队列)

题意:有n个队伍。 对于每个ENQUEUE  x 命令。 如果x所在的队伍已经在队列中, 则x排在队列中它的队伍的尾巴, 否则排在队列的末尾。 可以理解为队列中的队列的味道。 思路:用一个t...
  • MistKafka
  • MistKafka
  • 2013年07月25日 19:41
  • 2616

uva11324(tarjan缩点 + DAG图上的简单dp)

思路:先缩点,再构图,最后dp。dp[u] = max(dp[u],dfs(v) + val[u]); #include #include #include #include #includ...
  • KIJamesQi
  • KIJamesQi
  • 2015年10月02日 14:03
  • 503

UVa822 - Queue and A(看着也写不利索的结构体)

#include #include #include using namespace std; struct topic{ int tid, num, t0, t, dt, q_num, fi...
  • a197p
  • a197p
  • 2015年03月11日 15:41
  • 553

[刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

题目:算法竞赛入门经典 3-10/UVa1587:Box 代码://UVa1587 - Box #include unsigned rect[6];//每个面各有一个一样的对应面,故12个边只要定义...
  • XieNaoban
  • XieNaoban
  • 2016年07月20日 14:25
  • 1674

经典状态dp题目

POJ 1185 炮兵阵地 一般这类题目列会很小10左右,我们需要枚举所有行,对于当前行,其放炮的位置只与上一行和上上行有关,我们记当前行状态和上一行状态便可转移了,dp数组开3维即可。 在枚举每...
  • waitfor_
  • waitfor_
  • 2014年01月29日 19:51
  • 2748

例题8-4 传说中的车 UVa11134

1.题目描述:点击打开链接 2.解题思路:这道题利用贪心法,由于横坐标和纵坐标没有任何关系,因此可以分别处理。对于横坐标或纵坐标,贪心策略是:先按照区间右端点从小到大排序,若相同,再按照区间左端点从大...
  • u014800748
  • u014800748
  • 2015年02月05日 21:14
  • 796

UVA dp题目汇总

UVa专题练习 A-4 10003 经典dp,可用四边形不等式优化 10029 基础dp,DAG最长路,需高效构图 10032 经典问题。子集和数问题。01背包问题 10036 能否在一个整...
  • nealgavin
  • nealgavin
  • 2013年04月21日 21:37
  • 704

第三章:UVa1588 解题报告

UVa1588 解题报告这道题可以直接模拟。因为齿轮是条状,高度只有两种,所以只要匹配字符串就可以了。两个字符串的相交区域计算高度相加是不是大于3,小于3便是合法的配对。处理A、B两个字符串时枚举B在...
  • ZpadT2
  • ZpadT2
  • 2015年05月06日 00:01
  • 983

最优矩阵链乘(动态规划dp)POJ 1651 Multiplication Puzzle

大体题意: 一个n*m的矩阵由n行m列共n*m排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个n*m的矩阵乘m*p的矩阵,运算量为n*m*p。 矩阵乘法不满足分配律,但满足结合律...
  • aozil_yang
  • aozil_yang
  • 2016年10月09日 20:18
  • 602

(题号)UVa OJ全部题目列表

 # ID Title Solved by Difficulty 1 100 The 3n + 1 problem 26485 1 2 102 ...
  • u013901393
  • u013901393
  • 2014年10月29日 18:14
  • 1801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 题目10128 Queue(DP)
举报原因:
原因补充:

(最多只允许输入30个字)