题意:有高为1,2,3...n的杆子各一根排成一行,从左边能看到L根,从右边能看到R根,求杆子的排列有多少种可能。

析:设d(i, j, k)表示高度为1-i的杆子排成一行,从左边看到j根,从右边看到k根的数目。当i>1时,我们按照从大到小的顺序按排杆子,

假设已经安排完i-1根了,那么还剩下一根就是高度为1的了,那么它放在哪都不会挡住任何一根杆子。情况有3种:

1.放在左边,那么在左边一定能够看到它,在右边看不到(因为i>1);

2.放在右边,那么在右边一定能够看到它,在左边看不到(因为i>1);

3.剩下的也就是放在中间了,那么我们有多少个地方可以放呢,答案很明显,i-2个,在左右两边都看不到它。

情况1时,在高度在2-i的杆子中,在左边能看到j-1根,从右边能看到k根,因为在左边加上第一根正好是j根,

同理,情况2,在高度在2-i的杆子中,在左边能看到j根,从右边能看到k-1根,因为在右边加上第一根正好是k根,

情况3呢?更好说,在高度在2-i的杆子中,在左边能看到j根,从右边能看到k根,因为在左边和右边都看不到第一根。

综上分析:d(i, j, k) = d(i-1, j-1, k) + d(i-1, j, k-1) + d(i-1, j, k) * (i-2),边界为d(1, 1 ,1) = 1;

可先把所以情况先扫出来,到时直接查询就行了,快捷方便。注意超过int了,要用long long存储。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#define mod %10056 using namespace std;
typedef long long LL;
LL d[25][25][25]; void init(){
memset(d, 0, sizeof(d));
d[1][1][1] = 1;
for(int i = 2; i <= 20; ++i)
for(int j = 1; j <= 20; ++j)
for(int k = 1; k <= 20; ++k)
d[i][j][k] = d[i-1][j-1][k] + d[i-1][j][k-1] + d[i-1][j][k] * (i-2);
} int main(){
init();
int T, n, l, r; cin >> T;
while(T--){
scanf("%d %d %d", &n, &l, &r);
printf("%lld\n", d[n][l][r]);
}
return 0;
}

UVa 1638 Pole Arrangement (递推或DP)的更多相关文章

  1. UVa 1638 Pole Arrangement【递推】

    题意:给出n根高度为1,2,3,---n的杆子,从左边能看到l根,右边能够看到r根,问有多少种可能 看的紫书的思路 先假设已经安排好了高度为2---i的杆子, 那么高度为1的杆子的放置方法有三种情况 ...

  2. UVa 1638 - Pole Arrangement(dp)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVA 1638 Pole Arrangement (dp)

    题意:有n个长度为1到n的柱子排列在一起,从左边看有l根从右边看有r根,问你所以排列中满足这种情况的方案数 题解:就是一个dp问题,关键是下标放什么,值代表什么 使用三维dp,dp[i][j][k]= ...

  4. UVA 1638 Pole Arrangement

    https://vjudge.net/problem/UVA-1638 题意: n根长度分别为1,2,3,4……n的木棍 将这些木棍竖着排成一列 问从左边看能看到L根,从右边看能看到R根的方案数 将木 ...

  5. [Codeforces676B]Pyramid of Glasses(递推,DP)

    题目链接:http://codeforces.com/problemset/problem/676/B 递推,dp(i, j)表示第i层第j个杯子,从第一层开始向下倒,和数塔一样的题.每个杯子1个时间 ...

  6. 算法技巧讲解》关于对于递推形DP的前缀和优化

    这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也 ...

  7. Uva 10446【递推,dp】

    UVa 10446 求(n,bcak)递归次数.自己推出来了一个式子: 其实就是这个式子,但是不知道该怎么写,怕递归写法超时.其实直接递推就好,边界条件易得C(0,back)=1.C(1,back)= ...

  8. UVA 10288 - Coupons(概率递推)

    UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...

  9. openjudge1768 最大子矩阵[二维前缀和or递推|DP]

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...

随机推荐

  1. const对象,指向const对象的指针 和 const 指针

    const对象: const对象声明时必须赋初值,该值在编译阶段确定,不可在程序中修改. const修饰符既可放在类型名前也可放在类型名后,通常放在类型名前.不过放在类型名后易于理解. const i ...

  2. caffe openpose/Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields配置(转)

    Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields 是CVPR2017的一篇论文,作者称是世界上第一个基于深度学习的 ...

  3. git创建仓库,并提交代码(第一次创建并提交)(转)

    一直想学GIT,一直不曾学会.主要是GUI界面的很少,命令行大多记不住.今天尝试提交代码,按GIT上给的方法,没料到既然提交成功了. 于是把它记下来,方便以后学习. 代码是学习用的,没多大意义: 下图 ...

  4. Servlet Request 请求转发

    request.getRequestDispatcher("logined.jsp").forward(request, response);    //登录用户在登录页面验证通过 ...

  5. R语言做条形图时候,离散变量和连续型变量的区别

    1)条形图 条形图或许是最常用图形,常用来展示分类(different categories on the x-axis)和数值(numeric values on the y-axis)之间的关系. ...

  6. CentOS 6.3安装配置supervisor进程管理工具

    1. Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启. 2. 根据服务器上的 ...

  7. 工作流和过程自动化框架 Camunda BPM

    Camunda BPM 是一个灵活的工作流和过程自动化框架,它的核心是一个在Java虚拟机内部运行的原生BPMN 2.0流程引擎,因此它可以嵌入到任何Java应用程序或运行时容器中.Camunda B ...

  8. while循环出现的问题

    1 int c = 0; while(c<=100) c++ } 自己看了很久没看出来,后来请教同学才知道,变量g是不能写在一开始的,因为while循环只是循环自己的那个花括号内的指令,不会循环 ...

  9. Spring工作原理与单例

    最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...

  10. 使用UltraISO制作光盘镜像

    为什么使用光盘镜像文件: 1. 有些光盘中的内容必须在光盘运行环境中运行: 有些光盘的内容要在光盘运行的时候才能运行,即使你安装到电脑上都不行!例如某些游戏光盘等,这样就得每次使用时都要用光盘,对光驱 ...