【XSY1841】Intervals
Description
在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x。
问有多少种方案,注意交换两个区间的顺序视为不同方案。
答案很大,输出模1000000007后的值。
Input
一行三个整数n,m,x
Output
一行一个整数,表示答案
Sample Input
2 3 3
Sample Output
6
HINT
对于30%的数据,nm<=20
对于100%的数据,nm<=100000
(实际上,\(n,m\le 400\))
Solution
尝试使用DP解决。
每一个区间的构成分两次事件:从某位置开始,并于某一位置关闭。
我们想象一下从左往右扫描的过程,当前扫描位置的左端有许多等待关闭的区间,因为区间不可重叠,我们可以得到两个性质:首先显然区间的开始位置不可共用;其次如果我们要关闭一个区间,必然关闭的是开始位置最靠前的区间,因此任意时刻关闭区间的选择是唯一的。
设\(f_{i,j,k}\)表示当前进行到第\(i\)位,已经引出了\(j\)个区间(不管是否关闭),并且有\(k\)个区间等待关闭。
由\(f_{i,j,k}\)出发,有4种转移:(i+1处是否开启一个区间)*(i+1处是否关闭最靠前的区间),转移即可。
如果i+1即下一个位置是\(x\),则只能进行(i+1处必须开启一个区间)*(i+1处是否关闭最靠前的区间)=2种转移。
Code
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD=1e9+7;
int n,m,x;
int f[2][405][405];
inline int mul(int x,int y){return 1LL*x*y%MOD;}
inline void upd(int &x,int y){(x+=y)%=MOD;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
int main(){
scanf("%d%d%d",&m,&n,&x);
int u=0,v=1;
f[u][0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++)
for(int k=0;k<=m;k++)
if(f[u][j][k]){
if(j<m) upd(f[v][j+1][k],f[u][j][k]);
if(j<m&&k<m) upd(f[v][j+1][k+1],f[u][j][k]);
if(i+1!=x&&k) upd(f[v][j][k-1],f[u][j][k]);
if(i+1!=x) upd(f[v][j][k],f[u][j][k]);
}
swap(u,v);
memset(f[v],0,sizeof f[v]);
}
int mt=1;
for(int i=1;i<=m;i++) mt=mul(mt,i);
printf("%d\n",mul(f[u][m][0],mt));
return 0;
}
【XSY1841】Intervals的更多相关文章
- 【POJ】【3680】Intervals
网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...
- 【poj1201】 Intervals
http://poj.org/problem?id=1201 (题目链接) 题意 给出n个区间${[ai,bi]}$,要求选出尽可能少的数,使得每个区间i中至少存在${c[i]}$个数. Soluti ...
- 【POJ1021】Intervals (最短路解差分约束)
题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...
- 【SPOJ116】Intervals
题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数.求在满足 N 个区间约束的情况下,至少要取多少个正整数. 题解:差分约束系统模板题. 差分约束系统是对于 N 个变量 ...
- 【POJ3680】Intervals(费用流)
题意:有n条线段,每条有起点,终点和一个权值 要求选取一些线段,使它们的权值和最大,并且使每一个点被覆盖不超过k次 1 ≤ K ≤ N ≤ 200 1 ≤ ai < bi ≤ 100,000, ...
- 【题解】Intervals
题目大意 有\(n\)个区间(\(1 \leq n \leq 200\)),第\(i\)个区间覆盖\((a_{i}, b_{i})\)且有权值\(w_{i}\)(\(1 \leq a_{i} &l ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【POJ 1201 Intervals】
Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...
- 【POJ 1201】 Intervals(差分约束系统)
[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS Memory Limit: ...
随机推荐
- Flink架构分析之资源分配
Task Slot Flink中每个真正执行任务的TaskManager都是一个JVM进程,其在多线程环境中执行一个或者多个子任务.为了控制一个JVM同时能运行的任务数量,flink引入了ta ...
- 主成分分析——PCA
在数据挖掘过程中,当一个对象有多个属性(即该对象的测量过程产生多个变量)时,会产生高维度数据,这给数据挖掘工作带来了难度,我们希望用较少的变量来描述数据的绝大多数信息,此时一个比较好的方法是先对数据进 ...
- go 运行项目
此时运行项目,不能像之前简单的使用go run main.go,因为包main包含main.go和router.go的文件,因此需要运行go run *.go命令编译运行.如果是最终编译二进制项目,则 ...
- Tomcat部署与使用
Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发 ...
- 44 道 JavaScript 难题(JavaScript Puzzlers!)
JavaScript Puzzlers原文 1. ["1", "2", "3"].map(parseInt) 答案:[1, NaN, NaN ...
- Daily Scrum (2015/11/1)
今天晚上我们照例召开了每周末的小组例会,主要总结本周的工作和讨论下一周的工作. 首先是本周的一些主要工作: 1.进行了代码的修改和完善. 2.开始进行服务器配置和UI. 3.学习借鉴了nutch爬虫的 ...
- Sprint9
进展:完善设置事件提醒界面,增加调用手机铃声部分,以及是否选择振动,以及可以添加事件进行保存.
- Hibernate笔记③--集合映射、组合映射、联合主键、查询案例
lazy 懒加载 默认为proxy 继承映射 discriminant column="type" type="string" 集合映射 生成表的语句: ...
- ubuntu下screen的使用
ubuntu下screen的使用 日常在通过SSH远程到服务器训练网络和深度学习的相关代码,经常需要花费很长的时间.利用SSH远程连接服务器,运行程序需要保证在此期间窗口不能关闭并且连接不能断开,否则 ...
- Journal entry of the eleventh chapter to chapter twelfth
第十一章:正如很多人一样,觉得软件工程这个课程好像没什么用,感觉提高不了自己的写代码能力,学的都是理论知识,好像对于我们这种技术类的专业离得有点远,是这样的吗? 第十二章:每样东西都没有完美的,即使我 ...