dp+Codeforces Round #274 (Div. 2)E
2014-10-23 19:19
411 查看
E. Riding in a Lift
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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
Output
Input
Output
Input
Output
Note
Two sequences p1, p2, ..., pk and
q1, q2, ..., qk are
distinct, if there is such integer
j (1 ≤ j ≤ k), that
pj ≠ qj.
Notes to the samples:
In the first sample after the first trip you are either on floor
1, or on floor 3, because
|1 - 2| < |2 - 4| and |3 - 2| < |2 - 4|.
In the second sample there are two possible sequences:
(1, 2); (1, 3). You cannot choose floor
3 for the first trip because in this case no floor can be the floor for the second trip.
In the third sample there are no sought sequences, because you cannot choose the floor for the first trip.
思路:dp[i][j]表示第i步到第j层有多少种方法,但是直接这样做复杂度太高,所以我们维护一个前缀和
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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
Note
Two sequences p1, p2, ..., pk and
q1, q2, ..., qk are
distinct, if there is such integer
j (1 ≤ j ≤ k), that
pj ≠ qj.
Notes to the samples:
In the first sample after the first trip you are either on floor
1, or on floor 3, because
|1 - 2| < |2 - 4| and |3 - 2| < |2 - 4|.
In the second sample there are two possible sequences:
(1, 2); (1, 3). You cannot choose floor
3 for the first trip because in this case no floor can be the floor for the second trip.
In the third sample there are no sought sequences, because you cannot choose the floor for the first trip.
思路:dp[i][j]表示第i步到第j层有多少种方法,但是直接这样做复杂度太高,所以我们维护一个前缀和
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; const int maxn=5010; const int MOD=1000000007; int dp[maxn],sum[maxn]; int a,b,n,k; int main() { while(scanf("%d%d%d%d",&n,&a,&b,&k)!=EOF) { memset(dp,0,sizeof(dp)); dp[a]=1; for(int i=1;i<=n;i++)sum[i]=sum[i-1]+dp[i]; for(int i=1;i<=k;i++) { sum[0]=0; for(int j=1;j<=n;j++) sum[j]=(sum[j-1]+dp[j])%MOD; for(int j=1;j<=n;j++) { if(j==b)continue; if(j>b) dp[j]=((sum -sum[j-(j-b+1)/2])%MOD-dp[j])%MOD; if(j<b) dp[j]=((sum[j+(b-j+1)/2-1]-sum[0])%MOD-dp[j])%MOD; } } int ans=0; for(int i=1;i<=n;i++) if(i!=b)ans=(ans+dp[i])%MOD; printf("%d\n",(ans+MOD)%MOD); } return 0; }
相关文章推荐
- Codeforces Round #274 Div.1 C Riding in a Lift --DP
- 【Codeforces Round 274 (Div 2)E】【DP 成段更新 打标记法 滚动数组】Riding in a Lift 乘坐k次电梯避免到达b层的方案数
- Codeforces Round #274 (Div. 2) E:Riding in a Lift DP + 前缀优化
- Codeforces Round #274 Div.1 C Riding in a Lift --DP
- Codeforces Round #274 (Div. 2) E题:Riding in a Lift(DP)
- Codeforces Round #387(Div. 2)D. Winter Is Coming【思维+dp】
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads (树形dp,lca)★ ★ ★
- Codeforces Round #260 (Div. 2)C. Boredom(dp)
- codeforces round# 302 (div1 C) (状压dp)
- 【Codeforces Round 331 (Div 2)D】【DP 记忆化搜索 期望DP区间性质 好题】Wilbur and Trees 砍树随机从右从左概率左倒右倒的期望底面覆盖长度
- Codeforces Round #360 (Div. 2) E. The Values You Can Make DP
- 【Codeforces Round 274 (Div 2)D】【STL-SET 讨论】Long Jumps 刻度尺最多加几个刻度使得可以测量X与Y
- Codeforces Round #277.5 (Div. 2) E. Hiking(二分 DP)
- 【Codeforces Round 275 (Div 2)E】【状压DP 概率DP求期望 线性相加思想 二进制系统函数】Game with Strings n个串目标串随机猜位置随机的猜出答案的期望步
- 【Codeforces Round 273 (Div 2)D】【DP 滚动数组】 Red-Green Towers 两种颜色积木拼搭最高锯齿楼每层颜色相同的总方案数
- Codeforces Round #FF (Div. 2/C)/Codeforces446A_DZY Loves Sequences(DP)
- Codeforces Round #426 (Div. 2) C. The Meaningless Game 思维 D. The Bakery dp
- Codeforces Round #274 Riding in a Lift (DP)
- Codeforces Round #416 (Div. 2)A B C 水 暴力 dp
- 【Codeforces Round 336 (Div 2) C】【贪心 DP思维】Chain Reaction 每个灯塔位置为a[]破坏b[]范围所有灯塔 设置一个灯塔使得最多灯塔被保留