BUPT2017 wintertraining(15) #4E

Gym - 101138K

题意

N节车厢的火车,每节车厢容量是1~K,那么有\(K^N\)种火车。

求选择D个连续的且容量相同的车厢的方案恰为T种的火车有多少种 模\(10^9+7\)。

(1 ≤ D ≤ n ≤ 3333, 0 ≤ T ≤ N - D + 1, 1 ≤ K ≤ \(10^9\)).

题解

\(f[i][j]\)表示前i节车厢,恰有j种选择方案的火车数量,那么

初始条件:\(f[0][0]=1\)

状态转移:

我们考虑扩展长度i的火车来增加方案个数,在第i节后面添加相同容量的车厢,且与第i节容量不同。

0种选择方案的情况:

如果i<D,方案一定是0种,每节都有K种容量可选择。

如果i>=D,扩展到 i 节车厢,扩展的长度j为1到D-1,容量有K-1种选择,都不会增加方案。

\[\begin{cases}
f[i][0]=K^i,&i<D\\
f[i][0]=(K-1)\cdot \sum_{j=1}^{j=D-1}f[i-j][0],&i\ge D
\end{cases}
\]

大于0种选择方案的情况,必须i>=D,考虑扩展到 i 节车厢:

扩展的长度k为1到D-1,都不会增加方案。

扩展长度k为D到i-1,K-1种容量选择,增加了方案数k-D+1(前提条件是j>=(k-D+1))。

扩展长度k=i,有K种容量选择,增加了方案数i-D+1。(前提条件是j>=(k-D+1))

\[f[i][j]=(K-1)\cdot \sum_{k=1}^{D-1}f[i-k][j]+(K-1)\cdot \sum_{k=D}^{k=i-1}f[i-k][j-(k-D+1)]+K\cdot f[0][j-(i-D+1)]
\]

但是这样进行动态规划,会超时,我们观察式子可以发现,求和的部分可以用前缀和来代替,就能免去冗余计算了。并且\(f[i][j]\)也没必要存下来了。

\(s[i][j]=(f[1][j]+f[2][j]+..+f[i][j])\cdot (K-1)\)

\(g[i][j]=(f[i][j]+f[i-1][j-1]+..+f[i-min(i,j)][j-min(i,j)])\cdot (K-1)\)且\(f[0][0]\)乘的是K。

实际上的计算过程是

\(s[i][j]=s[i-1][j]+f[i][j]\cdot(K-1)\)

\(g[i][j]=g[i-1][j-1]+f[i][j]\cdot(K-1)\)且\(g[0][0]=K\),\(g[i][0]=f[i][0]\cdot(K-1)\)

那么\(f[i][j]=s[i-1][j]-s[i-D][j]+g[i-D][j-1]\)

注意一下有减法的取模要模一下再加M再模一下。

代码

#include <cstdio>
#define M 1000000007
#define N 3344
using namespace std;
int n,d,t,l;
long long f=1,g[N][N],s[N][N];
int main() {
scanf("%d%d%d%d",&n,&d,&t,&l);
g[0][0]=l;
for(int i=1;i<=n;i++){
if(i<d)
f=f*l%M;
else
f=((s[i-1][0]-s[i-d][0])%M+M)%M;
g[i][0]=f*(l-1)%M;
s[i][0]=(s[i-1][0]+f*(l-1))%M;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=t;j++){
f=s[i-1][j];
if(i>=d)f=((f-s[i-d][j]+g[i-d][j-1])%M+M)%M;
s[i][j]=(s[i-1][j]+f*(l-1))%M;
g[i][j]=(g[i-1][j-1]+f*(l-1))%M;
}
printf("%lld",f);
return 0;
}

【 Gym - 101138K 】 The World of Trains (DP)的更多相关文章

  1. 【BZOJ 2298】 2298: [HAOI2011]problem a (DP)

    2298: [HAOI2011]problem a Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1326  Solved: 637 Descript ...

  2. 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)

    1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...

  3. 【NOIP模拟】LCS及方案数(DP)

    Description 对于一个序列

  4. 【BZOJ 2431】 [HAOI2009] 逆序对数列 (DP)

    Description 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数 ...

  5. 【CSP模拟】小凯的疑惑(DP)

    首先,这道题正解的思路是从subtask2而得来的,所以先讲一下subtask2的做法. 因为保证答案不超过long long,所以直接求最大权独立集即可:dp[u][0]表示u点一定不能取的答案,d ...

  6. 【Unity3D实战】摇摆直升机开发实战(一)

    [Unity3D实战]摇摆直升机开发实战(一) 1.点击[Assets],创建[Sprites]和[Resources]文件夹,然后将所需要的素材导入[Sprites]文件夹中. 2.找到[Sprit ...

  7. 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)

    题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...

  8. 【详解】ThreadPoolExecutor源码阅读(三)

    系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...

  9. 【详解】ThreadPoolExecutor源码阅读(二)

    系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在W ...

随机推荐

  1. 生成、查看文件的MD5、SHA、SHA256值

    生成文件的MD5.SHA.SHA256 Linux系统生成MD5.SHA.SHA256 md5sum file1.zip  >> MD5.txt sha1sum file1.zip > ...

  2. select 下拉选中

    <body> <select name="" id=""> <option value="">张三< ...

  3. Python高级特性(切片,迭代,列表生成式,生成器,迭代器)

    掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...

  4. Luogu P2827 蚯蚓

    看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...

  5. [SHOI2008]cactus仙人掌图[圆方树+树dp]

    题意 求仙人掌的直径(相距最远的两个点的距离). \(n\le 5\times 10^4​\) 分析 建立圆方树,讨论答案路径的 lca 在圆点还是方点. 利用树形 dp 求出每个圆点到 不同子树内圆 ...

  6. maven docker 插件集成的几个小坑

    昨晚看springboot视频的时候,发现可以使用docker-maven-plugin这个插件直接build出 docker 镜像到远程服务器上,感觉很方便,于是自己也试了一下,但是碰到了几个问题, ...

  7. Nginx 403 Forbidden 解决方案 史上最靠谱

    原因 1. SELinux为开启状态(enabled) 查看SELinux的状态 sestatus 如果不是 disables , 需要 vi /etc/selinux/config 将以前的 SEL ...

  8. 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  9. kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)

    继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装:kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)kvm虚拟化管理平台WebVirtMgr部署-完 ...

  10. PHP从入门到精通(四)

    PHP数组中的常用函数汇总 为了更直观的讲解各函数的作用和用法,方便大家的理解,首先,我们来定义一个数组.下面各函数的操作将以本数组为例: $arr = array(1,2,3,4,5,6," ...