Codeforces Round #274 (Div. 2) E. Riding in a Lift(DP)

Codeforces Round #274 (Div. 2) E. Riding in a Lift(DP)

大家好,又见面了,我是全栈君。

Imagine that you are in a building that has exactly n floors. You can move between the floors in a lift. Let’s number the floors from bottom to top with integers from 1 to n. Now you’re on the floor number a. You are very bored, so you want to take the lift. Floor number b has a secret lab, the entry is forbidden. However, you already are in the mood and decide to make k consecutive trips in the lift.

Let us suppose that at the moment you are on the floor number x (initially, you were on floor a). For another trip between floors you choose some floor with number y (y ≠ x) and the lift travels to this floor. As you cannot visit floor b with the secret lab, you decided that the distance from the current floor x to the chosen y must be strictly less than the distance from the current floor x to floor b with the secret lab. Formally, it means that the following inequation must fulfill: |x - y| < |x - b|. After the lift successfully transports you to floor y, you write down number y in your notepad.

Your task is to find the number of distinct number sequences that you could have written in the notebook as the result of k trips in the lift. As the sought number of trips can be rather large, find the remainder after dividing the number by 1000000007 (109 + 7).

Input

The first line of the input contains four space-separated integers n, a, b, k (2 ≤ n ≤ 5000, 1 ≤ k ≤ 5000, 1 ≤ a, b ≤ n, a ≠ b).

Output

Print a single integer — the remainder after dividing the sought number of sequences by 1000000007 (109 + 7).

Sample test(s)
input
5 2 4 1

output
2

input
5 2 4 2

output
2

input
5 3 4 1

output
0

题意:做电梯。刚開始的时候你在a层,不能到b层,每次你到新的地方的y,必须满足|x-y|<|x-b|,求坐k次有多少种可能

思路:比較easy想到的是dp[i][j]表示第i次到了j层的可能。分情况讨论。比如:当a<b的时候。下一次的层数i是不能超过j+(b-j-1)/2的,然后每次预先处理出前j层的可能。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int mod = 1000000007;
const int maxn = 5005;

int n, a, b, k, dp[maxn][maxn];
int sum[maxn];

int main() {
	scanf("%d%d%d%d", &n, &a, &b, &k);	
	memset(dp, 0, sizeof(dp));
	if (a < b) {
		dp[0][a] = 1;
		for (int j = 1; j < b; j++)
			sum[j] = sum[j-1] + dp[0][j];
		for (int i = 1; i <= k; i++) {
			for (int j = 1; j < b; j++)
				dp[i][j] = (sum[(b-j-1)/2+j] - dp[i-1][j] + mod) % mod;
			sum[0] = 0;
			for (int j = 1; j < b; j++)
				sum[j] = (sum[j-1] + dp[i][j]) % mod;
		}
		printf("%d\n", sum[b-1]);
	}
	else {
		dp[0][a] = 1;
		for (int j = n; j >= b+1; j--)
			sum[j] = sum[j+1] + dp[0][j];
		for (int i = 1; i <= k; i++) {
			for (int j = b+1; j <= n; j++) 
				dp[i][j] = (sum[j-(j-b-1)/2] - dp[i-1][j] + mod) % mod;
			sum[0] = 0;
			for (int j = n; j >= b+1; j--)
				sum[j] = (sum[j+1] + dp[i][j]) % mod;
		}
		printf("%d\n", sum[b+1]);
	}
	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115727.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • vue父子组件传值:详解父组件向子组件传值(props)

    vue父子组件传值:详解父组件向子组件传值(props)vue父子组件传值:父组件向子组件传值(props)定义父组件2.定义子组件关键点:1.父组件想要向子组件传值,那么需要在子组件引入的地方绑定要传的值,并且要在父组件中引入子组件。2.绑定的值可以是一个自定义属性来存放父组件向子组件传递的数据。3.子组件使用props属性接收,然后可以直接在页面上以这个形式“{{}}”引用1.父组件代码如下:<template><div>父组件:<inputtype=”text”v-mode

    2022年6月5日
  • CDN技术详解及实现原理「建议收藏」

    CDN技术详解及实现原理「建议收藏」CDN技术详解一本好的入门书是带你进入陌生领域的明灯,《CDN技术详解》绝对是带你进入CDN行业的那盏最亮的明灯。因此,虽然只是纯粹的重点抄录,我也要把《CDN技术详解》的精华放上网。公诸同好。第

    2022年7月2日
  • sql优化的几种方式

    sql优化的几种方式一、为什么要对SQL进行优化我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。二、SQL优化的一些方法1.对查询进行优化,应尽量避免全表扫描…

    2022年6月22日
  • 网页设计(新手入门)[通俗易懂]

    网页设计(新手入门)[通俗易懂]1.HTML的基本结构<!DOCTYPEHTML><html><head><title>百度一下,你就知道</title></head><body>……</body></html>HTML:是用于制作网页的超文本标记语…

    2022年4月19日
  • 一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」

    一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」神经网络结构以及前向传播过程损失函数和代价函数反向传播1矩阵补充知识11矩阵求梯度12海塞矩阵13总结2矩阵乘积和对应元素相乘3反向传播原理四个基础等式4反向传播总结41单样本输入公式表42多样本输入公式表本文小结Hello,对于神经网络的原理,我入门了好多次,每次都觉得懂了,但是其实内部原理并没有理解透彻。经过不懈努力,终于茅塞顿开,遂总结此文。本

    2022年7月20日
  • Linux下的压缩解压缩命令详解

    Linux下的压缩解压缩命令详解

    2021年8月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号