题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=4221

题解

orz WYC 爆切神仙DP
首先将所有袋鼠按大小排序。考虑从前往后DP, 设$f[i][j]$表示前$i$个元素形成了$j$条链。
然而需要处理“套到不能套为止”的问题,因此再加一维: $k$表示目前有多少个元素确定了必须要套后面的袋鼠。
设$cnt[i]$表示有多少个别的袋鼠能套$i$. 那么从$i-1$转移到$i$时$k$的范围是$[0,cnt[i]-(i-j-1)]\(, 因为前\)(i-1)$个袋鼠形成了$j$条链,有$(i-j-1)$个袋鼠已经套上了,由于袋鼠是从大到小排的,那么能套上$i$之前的袋鼠就能套$i$, 因此$(i-j-1)$就是能套上$i$且套了的袋鼠个数,$cnt[i]-(i-j-1)$就是能套上$i$且还没套的袋鼠个数。
转移:
(1) 这个点作为链的起点。这样会导致任何没套上袋鼠的袋鼠都要再套一个比$i$小的袋鼠,因此转移到$dp[i][j+1][cnt[i]-(i-j-1)]$.
(2) 插入到一个链的末尾。这个链有可能是必须要套后面的袋鼠也有可能不是。乘上相应的系数转移即可。
时间复杂度$O(n3)$.
据说有神仙$O(n
2)$做法……哪位大爷教教我啊

代码

#include<bits/stdc++.h>
#define llong long long
using namespace std; const int N = 300;
const int P = 1e9+7;
struct Element
{
int a,b;
bool operator <(const Element &arg) const {return a>arg.a;}
} a[N+3];
int cnt[N+3];
llong dp[2][N+3][N+3];
int n; void updsum(llong &x,llong y) {x = (x+y)%P;} int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d%d",&a[i].a,&a[i].b);
sort(a+1,a+n+1);
for(int i=1; i<=n; i++) {for(int j=1; j<i; j++) {if(a[j].b>a[i].a) cnt[i]++;}}
dp[0][0][0] = 1ll; int cur = 0,nxt = 1;
for(int i=1; i<=n; i++)
{
memset(dp[nxt],0,sizeof(dp[nxt]));
for(int j=0; j<=i; j++)
{
for(int k=0; k<=cnt[i]-(i-j-1); k++)
{
if(dp[cur][j][k])
{
updsum(dp[nxt][j][k],dp[cur][j][k]*(cnt[i]-(i-j-1)-k));
if(k) {updsum(dp[nxt][j][k-1],dp[cur][j][k]*k);}
updsum(dp[nxt][j+1][cnt[i]-(i-j-1)],dp[cur][j][k]);
}
}
}
cur^=1,nxt^=1;
}
llong ans = 0ll;
for(int i=0; i<=n; i++) {ans = (ans+dp[cur][i][0])%P;}
printf("%lld\n",ans);
return 0;
}

BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)的更多相关文章

  1. BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...

  2. LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)

    题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填 ...

  3. LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)

    题目链接 https://loj.ac/problem/2733 题解 神仙题-- 首先可以观察到一个结论: 目标块的两块小三明治一定分别是最后和倒数第二个被吃的. 由此我们可以考虑这两块谁先被吃.这 ...

  4. [JOI2012春季合宿]Rotate (链表)

    题意 题解 又是一道神仙题-- 显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉. 正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1) ...

  5. [JOI2012春季合宿]Constellation (凸包)

    题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...

  6. JOI2017 春季合宿:Railway Trip

    自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...

  7. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】

    题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...

  8. [JOI2017春季合宿]Port Facility[set、二分图]

    题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...

  9. UOJ #356. 【JOI2017春季合宿】Port Facility

    Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方 ...

随机推荐

  1. linux 阿里云 新机器 安装jdk1.8

    2019年7月17日15:58:34 按着顺序来: wget https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4f ...

  2. UVA10603Fill题解--BFS

    题目链接 https://cn.vjudge.net/problem/UVA-10603 分析 经典的倒水问题,直接BFS. 对于喜闻乐见的状态判重,一开始想来个哈希函数把一个三元组映射成一个数,后面 ...

  3. 09 SSH原理与远程登录实现方式

    一.什么是SSH? SSH是一种网络协议,用于计算机之间的加密登录.使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露. 二.LInux下的基本用法 ...

  4. django 中间键重定向

    1,定义和注册中间件 在注册的中间件中使用: from django.http import HttpResponseRedirect '''下面的书写方法会陷入死循环,所以必须加判断条件只调用一次' ...

  5. 使用flex布局解决百分比高度元素垂直居中

    方法一: align-self(解决父元素下面单个子元素布局方式) 父级加上 div{display:flex} 子元素 span { flex-grow: 1; align-self: center ...

  6. babel详解

    https://segmentfault.com/a/1190000019718925 https://babeljs.io/blog/2019/03/19/7.4.0#core-js-3-7646- ...

  7. 【Git的基本操作二】添加、提交、查看状态

    添加.提交.查看状态操作 查看状态: git status  

  8. 4.ID主键生成策略

    保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  9. Java反射【三、方法的反射】

    获取一个类下的所有方法 可以获取类类型后,获取到所有方法及相关信息 Method[] ms = c.getMethods(); 获取方法列表(public) Method[] ms = c.getDe ...

  10. conda创建和使用python的虚拟环境

    https://uoa-eresearch.github.io/eresearch-cookbook/recipe/2014/11/20/conda/ 当我们使用服务器的时候,会存在多个用户,并且可能 ...