UVA10128 - Queue(dp)

题目链接

题目大意:有N个人,通过排序,可以使得从前面往后面看只有P个人,从后面往前面看,只有R个人。问这样的排列有多少种。

解题思路:之前一直在要想怎么排序,结果是方法没找好,看了别人的题接后才发现应该把高个子的先排好,然后再把矮个子的插进去,这样对于从前往后看,还是从后往前看才有规律可循。假设n - 1个人已经排好对了,现在要排第n个人,这个人比之前的n - 1个人都要矮,这样我们就可以有三种排法:(1)、排在最前面那么前面看的就多了一个人;(2)排在对尾,那么从后面看的就多了一个人。(3)排在n个人的(n- 2)个间隙中的任何一个。那么前面看还是后面看都不会改变人数。

递推式:dp[n][p][r] = (n - 2)?dp[n
- 1][p][r] + dp[n - 1][p - 1][r] + dp[n - 1][p][r - 1];

代码:

#include <cstdio>
#include <cstring>

typedef long long ll;
const int maxn = 15;

ll f[maxn][maxn][maxn];

int main () {

    int T;
    int N, P, R;
    scanf ("%d", &T);
    while (T--) {

        memset (f, 0, sizeof (f));
        scanf ("%d%d%d"    , &N, &P, &R);

        f[1][1][1] = 1;
        for (int i = 2; i <= N; i++)
            for (int j = 1; j <= i; j++)
                for (int k = 1; k <= i; k++) {
                    f[i][j][k] = (i - 2) * f[i - 1][j][k] + f[i - 1][j - 1][k] + f[i - 1][j][k - 1];
                }
        printf ("%lld\n", f[N][P][R]);
    }
    return 0;
}

时间: 2024-08-27 11:38:42

UVA10128 - Queue(dp)的相关文章

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

hdu4939 Stupid Tower Defense (DP)

2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 366    Accepted Submission(s): 88 Problem Description FSF is addicted to a stupid tower defense game.

BZOJ 1294 围豆豆Bean(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1294 题意: 思路:f[i][j][st]表示从(i,j)出 发到(i,j)停止组成的回路.状态为st的最小步数.从每个0的位置(i,j)进行BFS一次,得到所有的状态.判断一个路径是否包含某个格子时,可以 从该格子向左发出一条射线,判断这条射线与路径交点个数.为奇数时包含. char s[N][N]; int f[N][N][1<<9]; int a[N],n,m,K; int b

HDU 4832 Chess (DP)

Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24    Accepted Submission(s): 10 Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.

HDU 4833 Best Financing (DP)

Best Financing Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29    Accepted Submission(s): 3 Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dat

Ural 1353 Milliard Vasya&amp;#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j].表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说.总能够看成在前i-1位后面加上一个0~9.所以状态转移方程就非常easy出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计就可以. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #inclu

HDU 5617 Jam&#39;s maze(DP)

题目链接:点击打开链接 题意:给你一个n*n的矩阵.  求从(1,1)走到(n,n)所组成的回文串个数. 思路:一开始傻逼把状态写成了d[x][y][s],s表示一个串, 用map存的, 后来发现极不可行, 因为这个状态简直太大了, 包括了s串的所有情况. 只是相当于一个dfs中的剪枝罢了. 后来想到, 其实串是不必记录的, 我们只要统计个数, 所以不妨在DP的过程中就判断回文串的情况, 那么就需要同时记录两头的情况.  为了不爆内存, 将状态表示成d[i][x1][x2], 表示走了i步, 左