【UVA1638】杆子的排列
题面
有高为 1, 2, …, n 的 n 根杆子排成一排, 从左向右能看到 L 根, 从右向左能看到 R 根。求有多少种可能的排列方式。
分析
数据范围仅200,本来是往组合数学方面想的,看到了这个200就放弃了念头,果然是dp
定义dp[i][j][k]是用了高度为1~i的杆子,从左边能看到j个,从右边能看到k个
如果从1转移到n很困难,因为放一个高的杆子进去会造成很多的遮挡影响,是几乎不能维护的。于是考虑从n转移到1,即先放比较高的杆子
加上放好了2~n高度的杆子,再放高度为1的杆子仅有三种情况
1.放在最左边。仅仅是从左看能多看到一个 dp[i][j][k]+=dp[i-1][j-1][k]
2.放在最右边,同理
3.放在中间,一定会被挡住。i-1根杆子间有(i-2)个可以放置的空格,则dp[i][j][k]+=dp[i-1][j][k]*(i-2)。
其实这里i的定义已经发生了一点变化,但是状态转移是很容易理解的
为什么可以把i等效定义为i个,而不是1~i呢?其实这只需要代表是i根高度不同的杆子,2~i的杆子全部砍1,相对高度没有变,也就等效成了1~i-1的杆子
代码
#include<bits/stdc++.h> using namespace std; #define mod 998244353 #define ll long long #define N 220 ll dp[N][N][N]; ll t,n,l,r; int main() { dp[1][1][1]=1;for(ll i=2;i<=200;i++)for(ll j=1;j<=i;j++)for(ll k=1;k<=i-j+1;k++)dp[i][j][k]=(dp[i-1][j-1][k]+dp[i-1][j][k-1]+dp[i-1][j][k]*(i-2)%mod)%mod;scanf("%lld",&t); while(t--){scanf("%lld%lld%lld",&n,&l,&r);printf("%lld\n",dp[n][l][r]);} return 0; }
转载于:https://www.cnblogs.com/NSD-email0820/p/9561589.html
【UVA1638】杆子的排列相关推荐
- NOIP模拟(10.22)T2 杆子的排列
杆子的排列 题目背景: 10.22 NOIP模拟作业T2 分析:DP 定义状态dp[i][j][k]表示,目前枚举到第i大的数(即n - i + 1)那么显然如果这一个数放在左边,可以在左边被看到,放 ...
- [数学最安逸][UVa1638改编][第一类斯特林数+组合数]杆子的排列
有高为1,2,3,...,n的杆子各一根排成一行.从左边能看到l根,从右边能看到r根,求有多少种可能. (l,r <= 200,n <= 200000) 给出T 组数据 (T <= ...
- 例题10-15 杆子的排列 UVa1638
1.题目描述:点击打开链接 2.解题思路:本题通过寻找递推关系解决.设d(i,j,k)表示让高度为1~i的杆子排成一行,从左边能看到j根,从右边能看到k根的方案数.如果开始按照从小到大把1~i-1根杆 ...
- [NOIP2017模拟]杆子的排列
题目描述 有高为1, 2, -, n的n根杆子排成一排, 从左向右能看到 L 根, 从右向左能看到 R根. 求有多少种可能的排列方式. 输入格式 多组数据,第一行一个数T,表示数据组数. 接下来T行, ...
- Pole Arrangement UVA - 1638 杆子的排列
题目链接 有高为1, 2, 3,-, n的杆子各一根排成一行.从左边能看到l根,从右边能看到r根,求有 多少种可能.例如,图10-9中的两种情况都满足l=1,r=2(1≤l,r≤n≤20). [分析] ...
- 一、汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的。A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆
一.汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.提示: ...
- leetcode 567. Permutation in String 字符串的排列 滑动窗口法
题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...
- LeetCode简单题之基于排列构建数组
题目 给你一个 从 0 开始的排列 nums(下标也从 0 开始).请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans ...
- LeetCode简单题之重新排列数组
题目 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,-,xn,y1,y2,-,yn] 的格式排列. 请你将数组按 [x1,y1,x2,y2,-,xn,yn] 格式重新排列,返回重 ...
最新文章
- 2022-2028年中国共享住宿行业深度调研及投资前景预测报告
- Windows系统“无法打开”故障解决方法之一
- python安装教程windows-PyCharm 安装教程(Windows)
- php操作redis_PHP操作redis的两种方式
- select函数测试
- PCA降维算法原理及代码实现(python和matlab)
- Spring容器和springmvc容器的区别联系
- php mysql读取数组_php实现通用的从数据库表读取数据到数组的函数实例
- java 窗口GUI
- 论文小综 | Attention in Graph Neural Networks
- 今天的这个小成绩,需要向阿里云的朋友报告一下!
- linux关闭交互模式,linux – 关闭cp(copy)命令的交互模式(cp:overwrite?)
- nor flash和nand flash
- python dataframe 取一行_python – Pandas dataframe获取每个组的第一行
- Leetcode:8.string-to-integer-atoi(字符串转整数)
- qt deleterLater
- c语言图形时钟编程,c语言程序+图形编程——打造简易的时钟
- linux同一台机器安装两台nginx
- mysql套接字连接_无法通过Remote上的套接字连接到本地MySQL服务器
- 【MATLAB笔记】对矩阵进行满秩分解