题目

对于一个数列A[1…N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值。假设所有数都在范围[1, K]内,按上面的步骤执行,有多少个长度N的数列满足A[1]被更新的次数恰好为P呢?

N,P<=150,K<=300

题解

感觉数据组数有点多,其实可以直接预处理出所有答案。

定义f[i][j][k]f[i][j][k]f[i][j][k]表示长度为iii,用≤j\le j≤j的数,形成的被更新kkk次的数列方案数。

这里把第一个数出现也看作更新了一次。

分类转移:

  • jjj第一次出现,方案为:f[i−1][j−1][k−1]f[i-1][j-1][k-1]f[i−1][j−1][k−1]
  • 放1→j1\to j1→j中任意值,方案为:j⋅(f[i−1][j][k]−f[i−1][j−1][k])j\cdot(f[i-1][j][k]-f[i-1][j-1][k])j⋅(f[i−1][j][k]−f[i−1][j−1][k]),这里前缀和相减,是需要之前的最大值恰好为jjj,这样才能不重不漏。
  • 再加上没有用到最大值jjj的方案:f[i][j−1][k]f[i][j-1][k]f[i][j−1][k],也就是做个前缀和。

CODE

#include <bits/stdc++.h>
using namespace std;
char cb[1<<18],*cs,*ct;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<18,stdin),cs==ct)?0:*cs++)
inline void rd(int &x) {
x = 0; char ch; while(!isdigit(ch=getc()));
do x=x*10+ch-'0'; while(isdigit(ch=getc()));
}
const int mod = 1e9 + 7;
const int MAXN = 150;
const int MAXM = 300;
int n, k, p, f[MAXN+5][MAXM+5][MAXN+5];
int main () {
for(int i = 0; i <= MAXM; ++i) f[0][i][0] = 1;
for(int i = 1; i <= MAXN; ++i)
for(int j = 1; j <= MAXM; ++j)
for(int k = 1; k <= MAXN; ++k)
f[i][j][k] = (f[i-1][j-1][k-1] + 1ll*j*(f[i-1][j][k]-f[i-1][j-1][k]+mod)%mod + f[i][j-1][k]) % mod;
int T; rd(T); while(T--) rd(n), rd(k), rd(p), printf("%d\n", f[n][k][p+1]);
}

BZOJ 2699: 更新 (DP)的更多相关文章

  1. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

  2. 【bzoj2699】更新 dp

    题目描述 对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值.假设所有数都在范围[ ...

  3. bzoj 1597 斜率DP

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5115  Solved: 1897[Submit] ...

  4. ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

    题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...

  5. BZOJ 4033 树形DP

    http://blog.csdn.net/mirrorgray/article/details/51123741 安利队长blog- 树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选 ...

  6. BZOJ 1090 - 区间dp

    Magic Door 题目大意: 给一个字符串,可以将重复的串缩成x(a),表示x个a,求能缩成的最小长度. 题目分析 区间dp: dp[i][j]表示i~j处理后的最小长度, 则有 \[dp[i][ ...

  7. 持续更新——dp的一些技巧

    共菜鸡笔者看的--会慢慢更新,也请看到的大佬留意一眼,指出不足. 对于一些对部分点的二维\(dp\),状态从左上角继承而来时,对于一个点\((x,y)\),对它编号\(x*m+y\),按照这个顺序\( ...

  8. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  9. BZOJ 1040 树形DP+环套树

    就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...

随机推荐

  1. ubuntu16.04 下Mongo数据库搭建

    一 数据库安装 1.下载自己需要的数据库版本和系统,下载地址:https://www.mongodb.com/download-center/community . 本文下载的为ubuntu 16.0 ...

  2. Java串口通信 RXTX 解决过程

    背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...

  3. java当中JDBC当中请给出一个sql server的helloworld例子

    [学习笔记] 1.sql server的helloworld例子: import java.sql.*; public class JdbcHelloSqlServer {  public stati ...

  4. Struts笔记4

    Struts2-拦截器-单个拦截器 自定义拦截器 1.创建一个继承AbstractInterceptor的类 package com.gyf.web.interceptor; import com.o ...

  5. raspbian buster阿里镜像

    配置以前,谨记教诲,先去看一下是否有对应版本的源,如下所示,阿里这更新速度...确实挺赶潮流的 最后就是正常更新即可,这样就快多了,要不然用国外的源,还不知道要等到猴年马月的. sudo apt-ge ...

  6. pfSense QoS IDS

    pfSense QoS IDS 来源 https://blanboom.org/2018/pfsense-setup/ 之前我使用的无线路由器是 RT1900ac,其内置了 QoS 和 IDS/IPS ...

  7. 【MySQL】数据库(分库分表)中间件对比

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  8. 【转载】Sqlserver存储过程中使用Select和Set给变量赋值

    Sqlserver存储过程是时常使用到的一个数据库对象,在存储过程中会使用到Declare来定义存储过程变量,定义的存储过程变量可以通过Set或者Select等关键字方法来进行赋值操作,使用Set对存 ...

  9. 自定义过滤器和标签 & 静态文件相关

    自定义过滤器和标签 1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名 ...

  10. EntityFramework进阶(二)- DbContext预热

    本系列原创博客代码已在EntityFramework6.0.0测试通过,转载请标明出处 在DbContext首次调用的时候,会很慢,甚至会有5,6秒的等待,通常称为冷查询.再次调用的时候,几毫秒就能请 ...