题意:定义函数\(f(A,B) = \sum_{i=1}^n \max(A_i,B_i)\),其中\(A\)和\(B\)都是长度为\(n\)的排列。给出\(n\)和\(k\),问有多少对\((A,B)\)满足\(f(A,B)\geq k\)。对\(10^9 + 7\)取模。

\(n \leq 50\)

首先,可以直接钦定\(A\)为\(1,2...n\)的一个排列,即对于所有\(i\)满足\(A_i = i\),最后答案再乘以\(n!\)。

然后就变成了对\(B\)这一个排列的计数问题。考虑函数\(f\)中有贡献的只有较大值,我们不必计较其中的较小值具体是什么。这启发我们在dp时把较小的数分配到较大的位置,并记录其数量。

因此,我们令状态\(dp_{i,j,k}\)表示当前从\(1\)开始放置了\(i\)个数,其中有\(j\)个数被分配到后面的位置,并且当前得到的函数值为\(k\)。当然,这里的函数值只包括\(\max(A_s,B_s) \leq i\)的值,这样便于转移。同样地,当我们把一个数分配到后面的位置上时,我们不能轻易乘上一个系数(可分配的位置个数),因为分配不同的位置对答案的贡献不同。

那么,对于第\(i+1\)个数以及位置,就有下面这些情况:

  • \(i+1\)放在第\(i+1\)个位置。那么,j不变,k+=i,且只有一种方案。
  • \(i+1\)放在前\(i\)个位置,第\(i+1\)个位置放了小于\(i+1\)的数。那么,j-=1,k+=2*i,且第\(i+1\)个数有\(j\)个位置可放,第\(i+1\)个位置也有\(j\)个数来放。因此有\(j^2\)种方案。
  • \(i+1\)放在前\(i\)个位置,第\(i+1\)个位置放了大于\(i+1\)的数。那么,j不变,k+=i,且第\(i+1\)个数有\(j\)个位置可放,放在第\(i+1\)个位置的数未确定。因此有\(j\)种方案。
  • \(i+1\)放在后面的位置,第\(i+1\)个位置放了小于\(i+1\)的数。那么,j不变,k+=i,且\(i+1\)未确定放在哪个位置,第\(i+1\)个位置有\(j\)个数来放。因此有\(j\)种方案。
  • \(i+1\)放在后面的位置,第\(i+1\)个位置放了大于\(i+1\)的数。那么,j+=1,k不变,且\(i+1\)放在哪里,第\(i+1\)个位置放什么都是为确定的。因此只有一种方案。

时间复杂度\(O(n^4)\)。

#include <bits/stdc++.h>
using namespace std; const int MAXN = 55, MOD = (int)(1e9 + 7);
int dp[2][MAXN][MAXN * MAXN];
class LittleElephantAndPermutationDiv1 {
public:
int getNumber( int N, int K );
};
int LittleElephantAndPermutationDiv1::getNumber(int N, int K) {
int p = 1;
memset(dp,0,sizeof dp);
dp[0][0][0] = 1;
for (int i = 1 ; i <= N ; ++ i, p ^= 1) {
memset(dp[p],0,sizeof dp[p]);
for (int j = 0 ; j < i ; ++ j) {
for (int k = 0 ; k <= 2500 ; ++ k) {
if (!dp[p^1][j][k]) continue;
(dp[p][j][k+i] += dp[p^1][j][k]) %= MOD;
if (j > 0) (dp[p][j-1][k+i+i] += 1ll * j * j * dp[p^1][j][k] % MOD) %= MOD;
if (i < N) (dp[p][j][k+i] += 1ll * j * dp[p^1][j][k] % MOD) %= MOD;
if (i < N) (dp[p][j][k+i] += 1ll * j * dp[p^1][j][k] % MOD) %= MOD;
if (i < N) (dp[p][j+1][k] += dp[p^1][j][k]) %= MOD;
}
}
}
p ^= 1;
int ret = 0;
for (int i = K ; i <= 2500 ; ++ i)
(ret += dp[p][0][i]) %= MOD;
for (int i = 1 ; i <= N ; ++ i)
ret = 1ll * ret * i % MOD;
return ret;
}

小结:这个dp的特色在于确定一个排列,从而同时对位置和值的分配dp,这样可以解决一些较复杂的问题。

【做题】TCSRM592 Div1 500 LittleElephantAndPermutationDiv1——计数&dp的更多相关文章

  1. 【做题】agc008f - Black Radius——计数&讨论&思维

    原文链接 https://www.cnblogs.com/cly-none/p/9794411.html \[ \newcommand{\stif}[2]{\left[ \begin{matrix} ...

  2. 【做题】ZJOI2017仙人掌——组合计数

    原文链接 https://www.cnblogs.com/cly-none/p/ZJOI2017cactus.html 给出一个\(n\)个点\(m\)条边的无向连通图,求有多少种加边方案,使得加完后 ...

  3. 【做题】ECFinal2018 J - Philosophical … Balance——dp

    原文链接 https://www.cnblogs.com/cly-none/p/ECFINAL2018J.html 题意:给出一个长度为\(n\)的字符串\(s\),要求给\(s\)的每个后缀\(s[ ...

  4. 【做题】CF285E. Positions in Permutations——dp+容斥

    题意:求所有长度为\(n\)的排列\(p\)中,有多少个满足:对于所有\(i \,(1 \leq i \leq n)\),其中恰好有\(k\)个满足\(|p_i - i| = 1\).答案对\(10^ ...

  5. 火题大战Vol.0 B 计数DP

    火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...

  6. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  7. [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]

    Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...

  8. DP 做题记录 II.

    里面会有一些数据结构优化 DP 的题目(如 XI.),以及普通 DP. *I. P3643 [APIO2016]划艇 题意简述:给出序列 \(a_i,b_i\),求出有多少序列 \(c_i\) 满足 ...

  9. 【做题】spoj4060 A game with probability——dp

    赛前做题时忽然发现自己概率博弈类dp很弱,心好慌.(获胜概率或最优解期望) 于是就做了这道题,续了特别久. 一开始列dp式子的时候就花了很长时间,首先搞错了两次,然后忘记了根据上一轮dp值直接确定选什 ...

随机推荐

  1. [16]Windows内核情景分析 --- 服务管理

    随时可以看到任务管理器中有一个services.exe进程,这个就是系统的服务控制管理进程,简称SCM 这个进程专门用来管理服务(启动.停止.删除.配置等操作) 系统中所有注册的服务都登记在\HKEY ...

  2. ENode, 领域模型,DDD

    Entity Framework之领域驱动设计实践 使用ENode框架前您需要了解的东西(初稿) 领域驱动设计实战--战略建模 http://www.cnblogs.com/yubaolee/p/Ca ...

  3. Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  4. MySql 学习参考目录

    [1]< MySql 数据类型> [2]< MySql 基础 > [3]< MySql 存储过程 > PS:个人认为,如上总结超值. Good Good Study ...

  5. PYQT5学习笔记之各模块介绍

    Qtwidgets模块包含创造经典桌面风格的用户界面提供了一套UI元素的类 Qtwidegts下还有以下常用对象,所以一般使用Qtwidegts时会使用面向对象式编程 QApplication: ap ...

  6. Class_third_实验报告

    设计思路:声明一个父类Shape并声明一个getArea()计算面积的空方法让子类Circle,Echelon,Triangle,Rectangle 继承父类的方法并根据类的不同重写getArea() ...

  7. Linux基础命令---IP路由操作

    ip ip指令可以显示或操作路由.网路设备,设置路由策略和通道. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora.   1.语法     ...

  8. SQLServer将服务器A表写到服务器B表

       不同服务器数据库之间的数据操作    --创建链接服务器  exec sp_addlinkedserver  'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '  ...

  9. GoldenGate Logdump基本使用

    Logdump是GoldenGate复制软件中附带的一个工具软件,在OGG的目录下可以找到.这个工具主要用于分析OGG生成的队列文件,查找记录.统计队列文件中的数据等. 在OGG安装目录下执行logd ...

  10. B/S开发介绍

    b/s 的优势: 1.开发成本低 2.管理维护简单 3.产品升级便利 4.对用户的培训费用低 5.用户使用方便,出现故障的概率小 b/s 的不足: 1.安全性不足 2.客户端不能随心变化,受浏览器限制