[HG]小G坐电梯 题解
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坐电梯 题解的更多相关文章
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- 【Luogu1912】【NOI2009】诗人小G(动态规划)
[Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
- 小G搭积木
A小 G 搭积木文件名 输入文件 输出文件 时间限制 空间限制box.cpp box.in box.out 2s 128MB题目描述小 G 喜欢搭积木.小 G 一共有 n 块积木,并且积木只能竖着一块 ...
- C++之路进阶——codevs2933(诗人小G)
2933 诗人小G 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 小G是一个出色的诗人 ...
- NOI 2009 诗人小G
题目描述 Description 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行 ...
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
随机推荐
- 说一下redis中5种数据类型的底层数据结构
前言: 阅读 redis设计与实现 一书的记录.未完待续... redis我们都知道有5种数据类型,分别是string,list,hash,set,zset,那么你知道它们的底层数据结构实现吗? ...
- ARM Cortex-M 系列 MCU 错误追踪库 心得
一. 感谢CmBacktrace开源项目,git项目网站:https://github.com/armink/CmBacktrace 二. 移植CmBacktrace 2.1 准备好CmBacktra ...
- Luogu P4902 乘积
题目 我们要求的是 \[ \prod\limits_{i=a}^b\prod\limits_{j=1}^i(\frac ij)^{\lfloor\frac ij\rfloor} \] 先把它拆开 \[ ...
- 测试基础_<一>
1: 过程决定质量, 测试过程贯穿整个软件开发声明周期; 2: 测试过程和开发过程在整个开发周期相辅相成; 3: 测试过程是对整个开发过程的验证, 二者互相依赖 4: 测试过程是整个测试活动中一个至关 ...
- innodb中一颗B+树能存储多少条数据
如图,为B+树组织数据的方式: 实际存储时当然不会每个节点只存3条数据. 以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据. B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来 ...
- QuickSort(快排)的JAVA实现
QuickSort的JAVA实现 这是一篇算法课程的复习笔记 用JAVA对快排又实现了一遍. 先实现的是那个easy版的,每次选的排序轴都是数组的最后一个: package com.algorithm ...
- wepy 使用filter过滤器
作为过滤器,filter的好处不言而喻,使用过vue的雄蝶内心乐开了花 那么在wepy中,遇到需要计算的数据,要如何使用filter去处理呢 新建.wxs文件 文件名称.位置自己看着来,当然能够一目了 ...
- scrapyd使用教程
1. 安装服务器: pip install scrapyd 启动: scrapyd 访问:127.0.0.1:6800 2. 安装客户端 pip install scrapyd-client 3. 进 ...
- computed、watch、methods的区别
computed:计算属性是用来声明式的描述一个值依赖了其它的值.当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM.这个功能非常强大,它可以让你的代 ...
- String和StringBuffer的常见用法
链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?answerType=1&f=dis ...