题面

有高为 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】杆子的排列相关推荐

  1. NOIP模拟(10.22)T2 杆子的排列

    杆子的排列 题目背景: 10.22 NOIP模拟作业T2 分析:DP 定义状态dp[i][j][k]表示,目前枚举到第i大的数(即n - i + 1)那么显然如果这一个数放在左边,可以在左边被看到,放 ...

  2. [数学最安逸][UVa1638改编][第一类斯特林数+组合数]杆子的排列

    有高为1,2,3,...,n的杆子各一根排成一行.从左边能看到l根,从右边能看到r根,求有多少种可能. (l,r <= 200,n <= 200000) 给出T 组数据 (T <= ...

  3. 例题10-15 杆子的排列 UVa1638

    1.题目描述:点击打开链接 2.解题思路:本题通过寻找递推关系解决.设d(i,j,k)表示让高度为1~i的杆子排成一行,从左边能看到j根,从右边能看到k根的方案数.如果开始按照从小到大把1~i-1根杆 ...

  4. [NOIP2017模拟]杆子的排列

    题目描述 有高为1, 2, -, n的n根杆子排成一排, 从左向右能看到 L 根, 从右向左能看到 R根. 求有多少种可能的排列方式. 输入格式 多组数据,第一行一个数T,表示数据组数. 接下来T行, ...

  5. Pole Arrangement UVA - 1638 杆子的排列

    题目链接 有高为1, 2, 3,-, n的杆子各一根排成一行.从左边能看到l根,从右边能看到r根,求有 多少种可能.例如,图10-9中的两种情况都满足l=1,r=2(1≤l,r≤n≤20). [分析] ...

  6. 一、汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的。A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆

    一.汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.提示: ...

  7. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  8. LeetCode简单题之基于排列构建数组

    题目 给你一个 从 0 开始的排列 nums(下标也从 0 开始).请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans ...

  9. LeetCode简单题之重新排列数组

    题目 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,-,xn,y1,y2,-,yn] 的格式排列. 请你将数组按 [x1,y1,x2,y2,-,xn,yn] 格式重新排列,返回重 ...

最新文章

  1. 2022-2028年中国共享住宿行业深度调研及投资前景预测报告
  2. Windows系统“无法打开”故障解决方法之一
  3. python安装教程windows-PyCharm 安装教程(Windows)
  4. php操作redis_PHP操作redis的两种方式
  5. select函数测试
  6. PCA降维算法原理及代码实现(python和matlab)
  7. Spring容器和springmvc容器的区别联系
  8. php mysql读取数组_php实现通用的从数据库表读取数据到数组的函数实例
  9. java 窗口GUI
  10. 论文小综 | Attention in Graph Neural Networks
  11. 今天的这个小成绩,需要向阿里云的朋友报告一下!
  12. linux关闭交互模式,linux – 关闭cp(copy)命令的交互模式(cp:overwrite?)
  13. nor flash和nand flash
  14. python dataframe 取一行_python – Pandas dataframe获取每个组的第一行
  15. Leetcode:8.string-to-integer-atoi(字符串转整数)
  16. qt deleterLater
  17. c语言图形时钟编程,c语言程序+图形编程——打造简易的时钟
  18. linux同一台机器安装两台nginx
  19. mysql套接字连接_无法通过Remote上的套接字连接到本地MySQL服务器
  20. 【MATLAB笔记】对矩阵进行满秩分解

热门文章

  1. android service中显示一个dialog
  2. Oracle学习(十四)分表分区
  3. Elasticsearch数据备份与恢复(基于HDFS)
  4. Zabbix 添加端口监控链接
  5. Redis 常用监控信息命令总结
  6. LeetCode 250. Count Univalue Subtrees
  7. Ubuntu常用安装源
  8. 年年岁岁花相似,岁岁年年竟相同
  9. xcode 4.3 调试的时候显示汇编,怎么办
  10. 行情分发速度为王,谁是证券公司的生命线?