Codeforces Round #274 (Div. 2) E. Riding in a Lift (DP ),
Imagine that you are in a building that has exactlyNFloors. You can move between the floors in a lift. Let's number the floors from bottom to top with integers from 1N. Now you're on the floor numberA. You are very bored, so you want to take the lift. Floor numberBHas a secret lab, the entry is forbidden. However, you already are in the mood and decide to makeKConsecutive trips in the lift.
Let us suppose that at the moment you are on the floor numberX(Initially, you were on floorA). For another trip between floors you choose some floor with numberY(Y =X) And the lift travels to this floor. As you cannot visit floorBWith the secret lab, you decided that the distance from the current floorXTo the chosenYMust be strictly less than the distance from the current floorXTo floorBWith the secret lab. Formally, it means that the following inequation must fulfill: |XAccept-Encoding-Y| Optional <optional |XAccept-Encoding-B|. After the lift successfully transports you to floorY, You write down numberYIn your notepad.
Your task is to find the number of distinct number sequences that you coshould have written in the notebook as the resultKTrips in the lift. As the sought number of trips can be rather large, find the remainder after dividing the number by 1000000007 (109 bytes + limit 7 ).
Input
The first line of the input contains four space-separated integersN,A,B,K(2 cores ≤ CoresNLimit ≤ limit 5000, 1 limit ≤ limitKLimit ≤ limit 5000, 1 limit ≤ limitA, Bytes,BLimit ≤ limitN,A =B).
Output
Print a single integer-the remainder after dividing the sought number of sequences by 1000000007 (109 bytes + limit 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
In the first place, you were on the first floor. You couldn't go to the second floor. Every time you go to the new place, must meet | x-y | <| x-B |, how many possibilities are there for sitting k times?
Idea: it is easy to think of dp [I] [j], which indicates the possibility that the I th reaches the j layer, which is discussed in different situations. For example, when a <B, the next layer I is not more than j + (b-j-1)/2, and then the possibility of pre-processing the previous j layer each time.
#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;}