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;
}

[HG]小G坐电梯 题解的更多相关文章

  1. [NOI2009] 诗人小G [题解]

    诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...

  2. bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)

    目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...

  3. 【Luogu1912】【NOI2009】诗人小G(动态规划)

    [Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...

  4. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  5. 小G搭积木

    A小 G 搭积木文件名 输入文件 输出文件 时间限制 空间限制box.cpp box.in box.out 2s 128MB题目描述小 G 喜欢搭积木.小 G 一共有 n 块积木,并且积木只能竖着一块 ...

  6. C++之路进阶——codevs2933(诗人小G)

    2933 诗人小G 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小G是一个出色的诗人 ...

  7. NOI 2009 诗人小G

    题目描述 Description 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行 ...

  8. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  9. LG1912 [NOI2009]诗人小G

    题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...

随机推荐

  1. Intellij IDEA中使用Debug调试

    转自:https://blog.csdn.net/zj420964597/article/details/78662299只是为了方便学习技术,少走弯路,如果有异议,请留言,及时处理!!!

  2. 2018.08.10【省赛&提高A组模拟】比赛总结

    题解 这次题目可真是太难了! 糟糕的运气使我AK的步伐寸步难行(士气严重下降). T1 这题还是比较水的(尽管我比赛时只拿了50分) 一些大佬们说:这题只是一道简单的暴力题,枚举l+二分r 就可以了. ...

  3. KMP(next数组的更新理解)Codeforces Round #578 (Div. 2)--Compress Words

    题目链接:https://codeforc.es/contest/1200/problem/E 题意: 有n串字符串,让你连起来:sample please ease in out   ---> ...

  4. Codeforces 1194B. Yet Another Crosses Problem

    传送门 直接枚举填满哪一行,然后看看这一行填满以后哪一列最小 这个预处理一下 $cnt[i]$ 表示初始时第 $i$ 列有几个位置填满就可以做到 $O(m)$ 对于所有情况取个 $min$ 就是答案, ...

  5. SQLServer 存储过程详解

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  6. Bat批处理文件入门

    这个东西吧,感觉在使用windows时作用不是很大,毕竟在windows环境下命令行确实用的比较少,但有时候也会用到,比如测试算法程序时使用批处理+文件可以省去每次手动输入.赶巧最近对批处理也比较感兴 ...

  7. php enum 数字类型插入失败的解决办法

    今天遇到一个问题,我设置mysql字段 existence 为enum ,值为 ''0','1'. 当使用 php 进行查找 where existence = 1 的时候,并没有查询出什么数据. 后 ...

  8. CentOS7部署ntp服务器

    主机 角色 192.168.48.128 Server 192.168.48.129 Client 192.168.48.130 Client 所有主机安装ntp服务 yum install -y n ...

  9. TensorFlow入门——安装

    由于实验室新配了电脑,旧的电脑就淘汰下来不用,闲来无事,就讲旧的电脑作为个人的工作站来使用. 由于在旧电脑上安装的是Ubuntu 16.04 64bit系统,系统自带的是Python 2.7,版本选择 ...

  10. LInux安装MySQL5.7.24详情

    安装包下载 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 我安装的是5.7版本 第二步: 选择:TAR (mysql-5.7.24-el7-x86_64. ...