C 小G坐电梯

题目描述

小G来到了著名的某大厦。大厦一共有n层,初始的时候小G在第 A 层。

小G特别想去B层小 M 的办公室看一看,然而因为安保原因,B层已经被封锁无法进入。

但是小G既然来了,就想在大厦里面逛一逛。大厦里面有一部电梯,小G决定坐 k 次电梯。

因为小G比较无聊,他给自己设定了这样一个规矩:假如当前他在x层,则他要去的下一个楼层y和x的楼层差必须要小于 x 和 B 的楼层差,即 \(|x−y| < |x−B|\) 。

每到达一个楼层,小G都要记录下来其楼层号。

当小G转完一圈后,他也记录下了 \(k + 1\) 个楼层号(可能有重复)。

小G现在 想知道,按照他定下的规矩,一共有多少种可能的楼层号序列?

题解

定义f[i][j][k]为当前走了i步,距离终点为j的,方向为k(0向下,1向上)。

暴力DP+前缀和,滚动数组压掉一维。

代码

#include <cstdio>
#include <cmath> using namespace std; #define max(a,b) ((a>b)?a:b) const int MOD = 1e9 + 7;
//k dlt lft 0:dwn, 1:up
long long f[10005][2];
long long pre[20005][2]; int mx_dlt, dlt; inline long long pls(long long a, long long b){
return ((a + b >= MOD) ? (a + b - MOD) : (a + b));
} inline void getPre(){
pre[0][0] = pre[0][1] = 0;
for (int j = 1; j <= mx_dlt; ++j){
pre[j][0] = pls(pre[j - 1][0], f[j][0]);
pre[j][1] = pls(pre[j - 1][1], f[j][1]);
}
for (int j = mx_dlt + 1; j <= mx_dlt * 2; ++j){
pre[j][0] = pre[j - 1][0];
pre[j][1] = pre[j - 1][1];
}
} int main(){
freopen("lift.in", "r", stdin);
freopen("lift.out", "w", stdout);
int n, A, B, k; scanf("%d %d %d %d", &n, &A, &B, &k);
mx_dlt = max(B * 2, abs(n - B) * 2); dlt = abs(A - B);
f[dlt][0] = (A < B), f[dlt][1] = (A > B);
getPre();
for (int i = 1; i <= k; ++i){
for (int j = 1; j <= mx_dlt; ++j){
int tmp0 = f[j][0], tmp1 = f[j][1];
if (B - j > 0)
f[j][0] = ((pre[mx_dlt][0] - pre[j / 2][0] - tmp0) % MOD + MOD) % MOD;
if (B + j <= n)
f[j][1] = ((pre[mx_dlt][1] - pre[j / 2][1] - tmp1) % MOD + MOD) % MOD;
}
getPre();
}
long long ans = (pre[mx_dlt][0] + pre[mx_dlt][1] + MOD * 2) % MOD;
printf("%lld", ans);
return 0;
}

最新文章

  1. ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理
  2. 链接的热键属性accesskey
  3. NOIP2005 等价表达式
  4. 【Android测试】【第十五节】Instrumentation——官方译文
  5. Quartz 基本概念及原理
  6. window.opener强大功能
  7. sql 批量操作(存在的更新,不存在的插入)
  8. Objective-C ,ios,iphone开发基础:几个常用类-NSString
  9. DB2数据库实例创建与删除 学习笔记
  10. 学习笔记——Java数字处理类
  11. C#Winform使用mysql作为本地数据库
  12. 【Luogu1345】周游加拿大(动态规划)
  13. 在Centos7.2(64位)下搭建Web服务器
  14. 常用的settings.xml文件
  15. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串
  16. C++二级指针第一种内存模型(指针数组)
  17. android adb介绍
  18. Android中的动画,选择器,样式和主题的使用
  19. saltstack plug in
  20. shell入门-grep过滤-1

热门文章

  1. MYSQL 优化--inner buffer 与关联查询变等值查询
  2. POJ - 1815 Friendship (最小点割集)
  3. TCP/IP 协议是如何保证数据可靠性的?
  4. Linux-1.1root初始密码设置,切换root用户
  5. 【Tomcat】热部署的遗留配置导致服务器无法启动
  6. with as 语句
  7. ES6 模块的加载实现 import和export
  8. Bss段的作用及初始化
  9. pickle和JSON的序列化
  10. docker_facenet_image在Docker容器中运行Facenet环境搭建