题目链接

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. the specified service is marked as deletion,can not find the file specified

    使用命令注册windows service sc create CCGSQueueService binpath= "D:\DKX4003\services\xxx.xx.xx\xxx.ex ...

  2. EXSI宿主机更换硬盘后虚机启动有问题

    环境说明: 最近EXSI主机磁盘坏掉了,重新换掉磁盘以后启动虚机有问题. 虚机的报错信息如下: 找了下修复方法,操作过程为: 尝试修复 (以下是百度的方法) ls -l /dev/mapper mkd ...

  3. postpreSQL和oracle数据库的递归

    oracle: --包含自身 select * from sec_org start with org_id ='9767FA56D52680AEE043C0A8670580AE' --开始节点 co ...

  4. python 中英文时间转换

    上例子:time='Friday, November 18, 2016',将其转换为标准格式: time_format = datetime.datetime.strptime(time, '%A, ...

  5. JS ES5

    常用 严格模式 use strict 必须使用var声明变量 禁止自定义函数this指向window 'use strict' funcion Person(name){ this.name = na ...

  6. vue入门:(底层渲染实现render函数、实例生命周期)

    vue实例渲染的底层实现 vue实例生命周期 一.vue实例渲染的底层实现 1.1实例挂载 在vue中实例挂载有两种方法:第一种在实例化vue时以el属性实现,第二种是通过vue.$mount()方法 ...

  7. vue事件处理机制

    <button @click="handleAdd1()">add1</button> <button @click="handleAdd2 ...

  8. 9 java 笔记

    1 所有的java对象都可以和字符串进行连接运算 2 在java中判断两个变量是否相等时:==运算符适用于基本类型的判断 3 JVM常量池保证相同的字符串直接量只有一个,不会产生多个相同的副本 4 O ...

  9. 如何源码编译安装并控制nginx

    安装nginx 注意 Linux操作系统需要2.6及其以上的内核(支持epoll) 使用nginx的必备软件 gcc编辑器 yum -y install gcc gcc-c++ pcre库(支持正则表 ...

  10. 函数缓存 (Function caching)

    函数返回值缓存是优化一个函数的常用手段.我们可以将函数.输入参数.返回值全部保存起来,当下次以同样的参数调用这个函数时,直接使用存储的结果作为返回(不需要重新计算). 函数缓存允许我们将一个函数对于给 ...