【 Gym - 101138K 】 The World of Trains (DP)
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种选择,都不会增加方案。
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]\)也没必要存下来了。
\(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)的更多相关文章
- 【BZOJ 2298】 2298: [HAOI2011]problem a (DP)
2298: [HAOI2011]problem a Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1326 Solved: 637 Descript ...
- 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)
1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...
- 【NOIP模拟】LCS及方案数(DP)
Description 对于一个序列
- 【BZOJ 2431】 [HAOI2009] 逆序对数列 (DP)
Description 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数 ...
- 【CSP模拟】小凯的疑惑(DP)
首先,这道题正解的思路是从subtask2而得来的,所以先讲一下subtask2的做法. 因为保证答案不超过long long,所以直接求最大权独立集即可:dp[u][0]表示u点一定不能取的答案,d ...
- 【Unity3D实战】摇摆直升机开发实战(一)
[Unity3D实战]摇摆直升机开发实战(一) 1.点击[Assets],创建[Sprites]和[Resources]文件夹,然后将所需要的素材导入[Sprites]文件夹中. 2.找到[Sprit ...
- 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)
题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...
- 【详解】ThreadPoolExecutor源码阅读(三)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...
- 【详解】ThreadPoolExecutor源码阅读(二)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在W ...
随机推荐
- Linux集锦
一:Linux文件系统 Linux系统有一个重要概念:一切都都式文件. Linux支持五种文件类型: Linux的目录结构如下: 常见目录说明: /bin: 存放二进制可执行文件(ls,cat,mkd ...
- LOJ500 ZQC的拼图 二分答案、DP
传送门 题意:给出$N$个直角三角形拼图和$M \times M$的网格,第$i$个直角三角形水平直角边边长为$\frac{1}{a_i}$,垂直直角边边长为$\frac{1}{b_i},$规定直角三 ...
- OpenBLAS简介及在Windows7 VS2013上源码的编译过程
OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...
- 校内模拟赛 Zbq's Music Challenge
Zbq's Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$.对于一个序列$S$,它的得分是 $$BasicScore=A\times \sum ...
- (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)
说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...
- [UWP 自定义控件]了解模板化控件(9):UI指南
1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性,用于在新建ControlTemplate时使用这些约定的属性. 譬如,修改HeaderedCont ...
- Vue Element Tabe Pager 分页方案
表格和分页分离的,但是使用中,却是结合在一起的. 分析 有以下方式触发查询: mounted 加载数据. 查询按钮 加载数据. pager 变化加载数据 加载数据函数: loadData 问题 mou ...
- Html5前端笔记
获取Dpi 在 window.load中添加: (function(){ if (!window.screen.deviceXDPI){ var tmpNode = document.createEl ...
- HTTP协议冷知识大全
如果不用HTTPS,HTTP协议如何安全的传输密码信息? HTTP协议是纯文本协议,没有任何加密措施.通过HTTP协议传输的数据都可以在网络上被完全监听.如果用户登陆时将用户名和密码直接明文通过HTT ...
- 树莓派3代b型静态IP设置,和ssh的wlan配置
https://blog.csdn.net/qq_36305492/article/details/78607557