一维dp, 时间:O(n*k), 空间O(n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mp make_pair
#define ios ios::sync_with_stdio(false);
template <typename T>
inline void read(T &x) {
char ch = getchar();
int f = 1; x = 0;
while (!isdigit(ch)) {if (ch == '-')f *= -1; ch = getchar();}
while (isdigit(ch)) {x = (x<<1) + (x<<3) + (ch^48); ch = getchar();}
x *= f;
}
ll qpow(ll x, ll y) {
ll a = 1, b = x;
while(y) {if(y&0x1) a*=b; b*=b; y>>=1;}
return a;
}
int main(void)
{
#ifdef LOCAL
ifstream cin("in.txt");
#endif
const int MOD = 1e9 + 7;
int n, m, k, p;
cin >> n >> m >> k >> p;
vector<int> dp(n+1, 0), ans(n+1, 0);
// 首先初始化第一步的状态
if(m == 1) ans[2] = 1;
else if(m == n) ans[n-1] = 1;
else ans[m-1] = ans[m+1] = 1;
// 从第二步开始计算
for(int cnt = 2; cnt <= k; cnt++) {
dp = ans; // 保存上一步的状态,防止数据错乱
for(int i = 1; i <= n; i++) {
if(i == 1) {
if(dp[i+1] == 0) ans[i] = 0; // 表示这一步不能到达
else ans[i] += dp[i+1];
} else if(i == n) {
if(dp[i-1] == 0) ans[i] = 0; // 表示这一步不能到达
else ans[i] += dp[i-1];
} else {
if(dp[i-1] == 0 && dp[i+1] == 0) ans[i] = 0; // 表示这一步不能到达
else ans[i] += (dp[i-1] + dp[i+1]);
}
ans[i] = (ans[i] >= MOD) ? ans[i] - MOD : ans[i];
}
}
cout << ans[p] << endl;
return 0;
}

京公网安备 11010502036488号