problem

luogu-P5999

solution

每个点只能跳一次,显然跳出来形成的顺序是一个排列。不难联想到最近刷的排列 dpdpdp。

然后,我觉得难点在于怎么转化这个跳的规则,因为现在并不确定能否按排列 dpdpdp 一样分段做。

跳的顺序形成的排列必须满足以下两个条件之一:

  • 排列中第 iii 个元素必须小于两边的元素。
  • 排列中第 iii 个元素必须大于两边的元素。

排列的起终点(墙)为 s,ts,ts,t。

转化后发现,这是可以排列 dpdpdp 的。

我们从小到大考虑 iii。设 f(i,j):f(i,j):f(i,j): 前 iii 个数将排列分成了 jjj 段的合法方案数。

  • iii 不是墙。

    • 合并两段,jjj 段有 j−1j-1j−1 个空。f(i,j)←f(i−1,j+1)∗jf(i,j)\leftarrow f(i-1,j+1)*jf(i,j)←f(i−1,j+1)∗j。

    • 新插一段,可以插在任何位置,但若 sss 已过则不能插首,若 ttt 已过则不能插尾。

      f(i,j)←f(i−1,j−1)∗(j−(i>s)−(i>t))f(i,j)\leftarrow f(i-1,j-1)*\big(j-(i>s)-(i>t)\big)f(i,j)←f(i−1,j−1)∗(j−(i>s)−(i>t))。

  • iii 是墙。只能放在首尾。

    • 单独成段。f(i,j)←f(i−1,j−1)f(i,j)\leftarrow f(i-1,j-1)f(i,j)←f(i−1,j−1)。
    • 与相邻段合并,相当于延伸。f(i,j)←f(i−1,j)f(i,j)\leftarrow f(i-1,j)f(i,j)←f(i−1,j)。

时间复杂度 O(n2)O(n^2)O(n2)。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 2005
int f[maxn][maxn];
int n, s, t;signed main() {scanf( "%lld %lld %lld", &n, &s, &t );f[1][1] = 1;for( int i = 2;i <= n;i ++ )if( i ^ s and i ^ t )for( int j = 1;j <= n;j ++ )f[i][j] = (f[i - 1][j - 1] * (j - (i > s) - (i > t) ) + f[i - 1][j + 1] * j) % mod;elsefor( int j = 1;j <= n;j ++ )f[i][j] = (f[i - 1][j - 1] + f[i - 1][j]) % mod;        printf( "%lld\n", f[n][1] );return 0;
}

[CEOI2016] kangaroo(排列dp)相关推荐

  1. 【刷题记录】排列dp

    文章目录 [AtCoder-ABC209-f] Deforestation [AtCoder-Educational DP Contest-T]Permutation 「JOI Open 2016」摩 ...

  2. 守列划分问题(圆排列+排列dp+结论)

    problem 将正整数 1∼n1\sim n1∼n 任意划分成 mmm 个非空集合 A1,...,AmA_1,...,A_mA1​,...,Am​. 一个划分是守序的,当且仅当存在一个环排列 (p1 ...

  3. #189 stat(动态规划)

    容易想到固定第一个排列为1~n,算出答案后乘上n!即可,但这样就离正解走远了. 考虑排列dp的一般套路,将数从大到小加入排列,这样每个位置第一次填数时(不管是第一个还是第二个排列)其贡献就确定了. 显 ...

  4. C++,软开测开,CV岗面试常考知识点

    准备尝试的公司: 华为,VIVO,CVTE,科大讯飞,图普科技,Bigo(百果园),网易,YY,虹软,浦发银行,新华三,多益,大话,海康 1.lambda 第六章 lambda表达式 Lambda表达 ...

  5. Leetcode动态规划专题(共38道)

    某一问题有很多重叠子问题 每一状态一定由上一状态推导出来 而贪心没有状态推导,而是直接选局部最优 解决方式: 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历 ...

  6. leetcode分类刷题

    1. 数组 数组是基本的数据结构,面试中考察数组的题目一般在思维上并不复杂,主要是考查面试者对代码的掌控能力. 数组下标都是从0开始 数组在内存空间的地址是连续的 题目: easy 704. 二分查找 ...

  7. 《labuladong的算法小超》A和《代码随想录》B阅读笔记(2)

    第9天 63.不同路径 你看,今天就涉及到带有路障的机器人运动问题了.先上代码再解析 class Solution:def uniquePathsWithObstacles(self, obstacl ...

  8. Leetcode 526.优美的排列 二进制状压DP

    题目链接:传送门 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数 ...

  9. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

最新文章

  1. Jade —— 源于 Node.js 的 HTML 模板引擎
  2. wordpress插件-WP Rocket 3.9.3缓存加速插件免授权版
  3. C++之析构函数探究
  4. 蓝桥杯 ADV-201 算法提高 我们的征途是星辰大海
  5. MySQL必知必会:数据插入(Insert)
  6. 华为认证HCDA免费公开课课表及其交流群公告
  7. 看看月明光彩照入东 水浒
  8. hadoop3访问hdfs web控制页面遇到的各种问题总结
  9. 威廉希尔赔率分析和结论
  10. scriptmanager
  11. nginx缓冲区关闭导致下载失败问题
  12. 単語ーー下げる(さげる)
  13. 怎么做好网络营销推广引流客户?
  14. 广州刷脸支付骗局_刷脸支付骗局你仔细观察一下
  15. java哪个软件编程好学吗_java编程好学吗
  16. 阿里妈妈展示广告召回之多场景建模算法
  17. C#远程服务器返回错误: (500) 内部服务器错误
  18. ssi 指令 php,SSI使用详解(一)_PHP教程
  19. React的React.FC与React.Component的初步认识
  20. Django开发学习之Ajax(二)

热门文章

  1. 2018年,该转行AI工程师吗?
  2. 大一计算机课实训总结1000字,大一计算机实训报告.doc
  3. 如何用Java讲一句话重复五遍_Java 0515 第二次课作业
  4. linux windows多任务,windows是多用户多任务系统吗?
  5. c语言浮点型常量表示平均数_小白基础知识必备|| 整型常量与进制间的转换
  6. java中如何运行小程序_一起学java(一)——运行第一个小程序
  7. git使用的基本流程_git命令的基本使用
  8. java 代码块 作用_Java核心(三):代码块的作用
  9. 能源36号文解读_IDC报告预测:今年中国新能源汽车销量将达116万辆,未来五年复合增长率36%_详细解读_最新资讯_热点事件...
  10. 7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀