UVa 1638 Pole Arrangement (递推或DP)
题意:有高为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)的更多相关文章
- UVa 1638 Pole Arrangement【递推】
题意:给出n根高度为1,2,3,---n的杆子,从左边能看到l根,右边能够看到r根,问有多少种可能 看的紫书的思路 先假设已经安排好了高度为2---i的杆子, 那么高度为1的杆子的放置方法有三种情况 ...
- UVa 1638 - Pole Arrangement(dp)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1638 Pole Arrangement (dp)
题意:有n个长度为1到n的柱子排列在一起,从左边看有l根从右边看有r根,问你所以排列中满足这种情况的方案数 题解:就是一个dp问题,关键是下标放什么,值代表什么 使用三维dp,dp[i][j][k]= ...
- UVA 1638 Pole Arrangement
https://vjudge.net/problem/UVA-1638 题意: n根长度分别为1,2,3,4……n的木棍 将这些木棍竖着排成一列 问从左边看能看到L根,从右边看能看到R根的方案数 将木 ...
- [Codeforces676B]Pyramid of Glasses(递推,DP)
题目链接:http://codeforces.com/problemset/problem/676/B 递推,dp(i, j)表示第i层第j个杯子,从第一层开始向下倒,和数塔一样的题.每个杯子1个时间 ...
- 算法技巧讲解》关于对于递推形DP的前缀和优化
这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也 ...
- Uva 10446【递推,dp】
UVa 10446 求(n,bcak)递归次数.自己推出来了一个式子: 其实就是这个式子,但是不知道该怎么写,怕递归写法超时.其实直接递推就好,边界条件易得C(0,back)=1.C(1,back)= ...
- UVA 10288 - Coupons(概率递推)
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
随机推荐
- hibernate-注解及配置
联合主键: 一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不 ...
- SAP订单状态最详细的解释
order status description explanation CRTD 建立 生产订单创建时的状态,表明订单处于刚刚创建时点,不允许做后续发料,确认等操作. PREL 部分释放(部分下达) ...
- 压缩文件tar.gz和zip之间的区别
我们在开发的时候通常要先下载相关的软件或者是源码,或者是jar包.在下载东西的时候总是碰见后缀是.tar.gz和.zip的问题,搞不清楚是怎么回事,不晓得下载哪个文件才是对自己有用的.现在我知道了,其 ...
- numpy linspace arange函数
linspace(start, end, num_of_points), 区间 [start, end],产生一个等差数列,差为:(end-start)/(num_of_point-1). arang ...
- os.popen与os.system区别
os.system 调用系统命令,完成后退出,返回结果是命令执行状态,一般是0 os.popen 可以实现一个“管道”,从这个命令获取的值可以在python 中继续被使用 #该方法不但执行命令还返回执 ...
- C++析构函数的自动调用问题
首先要明确一点,系统只会自动释放栈内空间,而堆内空间需要用户自己维护. C++中,除了new来的空间存放在堆内,其他均存放在栈中. 当单纯的创建对象的时候,对象存放在栈中,此时在程序块的}后面,系统会 ...
- git 使用 添加分支
http://jingyan.baidu.com/album/19192ad83ea879e53e5707ce.html?picindex=1 修改配置 git config --global use ...
- java列表转成 int[] 的格式
java 稀疏矩阵中输入的索引系列和对应的值系列需要用 int[] r_indices = new int[featureIdxList.size()]; 的数据格式. 但是实际中可能实现没法确定 f ...
- python引入模块时import与from ... import的区别(转)
import datetime是引入整个datetime包,如果使用datetime包中的datetime类,需要加上模块名的限定. 1 import datetime 2 3 print datet ...
- select top 变量问题
1.拼接查询语句(SQL2000,2005,2008均可) DECLARE @a AS INT SET @a=1 EXEC('SELECT TOP '+@a+' * FROM mtrcLanguage ...