袋鼠

news/2024/9/19 0:04:12/文章来源:https://www.cnblogs.com/zhengchenxi/p/18374799

先转化一下题意:求有多少个1~n的排列p能够满足 \(\forall i \in (1,n)\) ,使 $ p_{i} $ 左右两边的数同时小于或者大于 \(p_{i}\) ,并且\(p_{1}=s,p_{n}=t\)

比较明显的预设型DP(连转化题意我都做不到,悲),先正常来分析一下,我们填数从小往大枚举,如果我们填入一个数,它无非就两种可能,一种是开拓出一个新的区间,或者是把两个区间合并到一起,不可能填在边界而不合并区间,因为如果这样,我们填的这个数它旁边有一个小于它的数,未来还要再在它旁边填数,这个数一定大于它,无法满足左右两边的数同时大于它或小于它的条件。

根据上面的分析,我们不妨设 \(dp[i][j]\) 表示目前填到第 \(i\) 个数,目前有 \(j\) 个连续的区间。

那来列状态转移方程,首先如果是合并区间,那它有 \(j+1-1\) 个地方可以放数. \(dp[i][j]=dp[i-1][j+1]*j\)

如果是拓展出新的区间,那它也是有 \(j-1+1\) 个可以填数的地方. \(dp[i][j]=dp[i-1][j-1]*j\)

那到这里就有一个问题,咱们把 \(p_{1}=s,p_{n}=t\) 这个条件给丢了。

那我们接着分析,先考虑加上这个条件对我们刚才的转移会有什么影响,很明显当我们填上 \(s\)\(t\) 时,相当于整个区间的最左边界和最右边界已经确定,不会在改变,我们就无法再进行拓展,于是我们更改一下状态转移方程 \(dp[i][j]=dp[i-1][j-1]*(j-(i>s)-(i>t))\)

那我们接着考虑如果填的数为 \(s,t\) 时,我们怎么做,它同样可以拓展出一个新的区间,它还可以接在最左或最右边区间上,因为它的拓展位置是固定的,我们给它乘 \(1\) 就行。 \(dp[i][j]=dp[i-1][j-1]+dp[i-1][j]\)

到这里这道题就算是结束了。

using namespace std;#define int long long
const int N=2e3+107;
const int mod=1e9+7;int n,s,t;int dp[N][N];int read()
{int f=1,s=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}return f*s;
}signed main()
{freopen("kang.in","r",stdin);freopen("kang.out","w",stdout);n=read(),s=read(),t=read();dp[1][1]=1;for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){if(i!=s&&i!=t) dp[i][j]=(j*dp[i-1][j+1]%mod+(j-(i>s)-(i>t))*dp[i-1][j-1]%mod)%mod;else dp[i][j]=dp[i-1][j-1]+dp[i-1][j];}}printf("%lld",dp[n][1]);
}`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785905.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程

JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程 JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-writerside/…

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器 Citrix ADC - 混合多云应用交付控制器 请访问原文链接:https://sysin.org/blog/citr…

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, release Aug 19, 2024 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/,查看最新版。…

dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退

本文记录在使用 X11 过程中的问题,由于不正确使用导致栈空间被回收,从而在调用 XPutShmImage 时让应用闪退,此问题本质上讲只和 X11 的设计有一分钱关系,更多的问题在于我的写法上在 上一篇博客 里,介绍了使用 MIT-SHM 共享内存推送图片,详细请看:dotnet X11 简单使用 M…

Avalonia 11.1 已知问题 IterationCount 为 Infinite 的动画播放出现异常

如果在 Avalonia 后台代码播放一个动画,这个动画的 Animation 的 IterationCount 被设置为 Infinite 那么将在播放的时候抛出 InvalidOperationException 异常本文所使用的 Avalonia 为 11.1.0 版本,由于 Avalonia 行为和 API 变动较多,如大家使用其他版本还请重新测试 如以…

11 Large Companies That Use Java

https://terenbro.com/blog/11-large-companies-that-use-javaWhat is Java? Why do Companies Use Java? 11 Companies That Use Java Overview List of Companies That Use Java Consider Terenbro as Your Trusted Partner Final ThoughtsTOP-5 PostsPopular Java Use Cas…

mysql全片篇

零,快速总结篇# 1)、查询所有数据库 show databases ; # 2)、查询当前数据库 select database() ; # 3)、创建数据库 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] ; # 4)、删除数据库 drop database [ if exists ] 数据库名…

最简单100%解决pip 不是内部或外部命令,也不是可运行的程序 或批处理文件

相信你看了不少教程还是没有解决pip的问题 最关键的问题还是在于没有找到正确的路径。 解决办法: 在cmd中输入python -m pip install --upgrade pip, 它会告诉你 WARNING: Ignoring invalid distribution -ip (d:\python3.9\lib\site-packages)Requirement already satisfie…

为 OpenWrt 路由器编译 minieap-sysu 项目

学校的校园网要使用锐捷认证,于是想把认证客户端装到刷了 OpenWrt 的路由器上面。然而认证客户端 Linux 版只支持 x86 架构,我的路由器处理器却是 AArch64 架构,装不了,所以只能想办法找 AArch64 架构的解决方案。 经过一番搜索,我找到了 minieap-sysu 这个项目,不过需要…

线性dp:最长上升子序列

最长上升子序列本文与leetcode300.最长递增子序列,这题题意一样,阅读完本文可以挑战一下力扣链接 题目叙述: 给定一个无序的整数数组,找出其中最长上升子序列(LIS)的长度。 输入: [5,7,1,9,4,6,2,8,3]输出 4解释最长上升子序列是[1,4,6,8],其长度为4。动态规划的设计…

Day01 Uboot编译

一. 安装环境1. 安装依赖sudo apt-get install gcc make cmake rsync wget unzip build-essential git bc swig libncurses5-dev libpython3-dev libssl-dev python3-distutils android-tools-mkbootimg -y   2. 安装编译器wget http://releases.linaro.org/components/toolc…