您的位置:首页 > 产品设计 > UI/UE

UVA 题目10128 Queue(DP)

2015-11-18 11:03 615 查看
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代码

1645269810128QueueAcceptedC++0.0032015-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
[m][r]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: