[CEOI2016] kangaroo(排列dp)
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)相关推荐
- 【刷题记录】排列dp
文章目录 [AtCoder-ABC209-f] Deforestation [AtCoder-Educational DP Contest-T]Permutation 「JOI Open 2016」摩 ...
- 守列划分问题(圆排列+排列dp+结论)
problem 将正整数 1∼n1\sim n1∼n 任意划分成 mmm 个非空集合 A1,...,AmA_1,...,A_mA1,...,Am. 一个划分是守序的,当且仅当存在一个环排列 (p1 ...
- #189 stat(动态规划)
容易想到固定第一个排列为1~n,算出答案后乘上n!即可,但这样就离正解走远了. 考虑排列dp的一般套路,将数从大到小加入排列,这样每个位置第一次填数时(不管是第一个还是第二个排列)其贡献就确定了. 显 ...
- C++,软开测开,CV岗面试常考知识点
准备尝试的公司: 华为,VIVO,CVTE,科大讯飞,图普科技,Bigo(百果园),网易,YY,虹软,浦发银行,新华三,多益,大话,海康 1.lambda 第六章 lambda表达式 Lambda表达 ...
- Leetcode动态规划专题(共38道)
某一问题有很多重叠子问题 每一状态一定由上一状态推导出来 而贪心没有状态推导,而是直接选局部最优 解决方式: 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历 ...
- leetcode分类刷题
1. 数组 数组是基本的数据结构,面试中考察数组的题目一般在思维上并不复杂,主要是考查面试者对代码的掌控能力. 数组下标都是从0开始 数组在内存空间的地址是连续的 题目: easy 704. 二分查找 ...
- 《labuladong的算法小超》A和《代码随想录》B阅读笔记(2)
第9天 63.不同路径 你看,今天就涉及到带有路障的机器人运动问题了.先上代码再解析 class Solution:def uniquePathsWithObstacles(self, obstacl ...
- Leetcode 526.优美的排列 二进制状压DP
题目链接:传送门 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数 ...
- 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 ...
最新文章
- Jade —— 源于 Node.js 的 HTML 模板引擎
- wordpress插件-WP Rocket 3.9.3缓存加速插件免授权版
- C++之析构函数探究
- 蓝桥杯 ADV-201 算法提高 我们的征途是星辰大海
- MySQL必知必会:数据插入(Insert)
- 华为认证HCDA免费公开课课表及其交流群公告
- 看看月明光彩照入东 水浒
- hadoop3访问hdfs web控制页面遇到的各种问题总结
- 威廉希尔赔率分析和结论
- scriptmanager
- nginx缓冲区关闭导致下载失败问题
- 単語ーー下げる(さげる)
- 怎么做好网络营销推广引流客户?
- 广州刷脸支付骗局_刷脸支付骗局你仔细观察一下
- java哪个软件编程好学吗_java编程好学吗
- 阿里妈妈展示广告召回之多场景建模算法
- C#远程服务器返回错误: (500) 内部服务器错误
- ssi 指令 php,SSI使用详解(一)_PHP教程
- React的React.FC与React.Component的初步认识
- Django开发学习之Ajax(二)
热门文章
- 2018年,该转行AI工程师吗?
- 大一计算机课实训总结1000字,大一计算机实训报告.doc
- 如何用Java讲一句话重复五遍_Java 0515 第二次课作业
- linux windows多任务,windows是多用户多任务系统吗?
- c语言浮点型常量表示平均数_小白基础知识必备|| 整型常量与进制间的转换
- java中如何运行小程序_一起学java(一)——运行第一个小程序
- git使用的基本流程_git命令的基本使用
- java 代码块 作用_Java核心(三):代码块的作用
- 能源36号文解读_IDC报告预测:今年中国新能源汽车销量将达116万辆,未来五年复合增长率36%_详细解读_最新资讯_热点事件...
- 7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀