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. 05-Mirrorgate数据库信息

    1.登录数据库 [root@node1 ~]# mongo localhost: > show dbs; admin .000GB dashboarddb .001GB local .000GB ...

  2. decorator, async/await, generator

    ////////////decorator////////// function aopFunc (target, key, descriptor) { console.log('aopFunc') ...

  3. 从harbor部署到在k8s中使用

    一.概述 harbor是什么呢?英文单词的意思是:港湾.港湾用来存放集装箱(货物的),而docker的由来正是借鉴了集装箱的原理,所以harbor是用于存放docker的镜像,作为镜像仓库使用.官方的 ...

  4. es5中for...in 和es6中 for..of遍历

    //定义一个数组 var arr=['A','B','C']; //定义一个对象 var obj={name:'张三',age:20} // for..in 遍历数组 得到索引 for(var x i ...

  5. 【APIO2016】烟火表演

    题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...

  6. 基于Angular+WebAPI+OData的增删改查

    对于在ASP.NET WebAPI中怎么使用OData,已经在我前面的日志中的说明, 在ASP.NET Web API中使用OData 在这个示例中.我新建了一个Order的实体,在前端使用Angul ...

  7. 五年.net程序员Java学习之路

    大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...

  8. DevOps知识地图实践指南

    DevOps知识地图   DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. DevOps经典图书: * <DevOps实践指南> * <持续 ...

  9. linux下安装redis组件报错-gcc报错

    报错如图: 1.解决办法    先安装gcc插件.删除redis解压后文件.重新解压

  10. iphone忘记锁屏密码却记得appleID密码的不保存数据的刷机办法

    请注意看清题目再看本文,另外一切后果博主不负任何责任.操作实现环境:原装数据线,拔掉sim卡昨天,iPhone6sp忘记密码被锁定,尝试通过找回手机抹除手机功能后,提示需要手机接入互联网才能实现,而我 ...