zoukankan      html  css  js  c++  java
  • [CF479E] Riding in a Lift

    [CF479E] Riding in a Lift - dp

    Description

    一个楼有N层,由于你很无聊,你开始玩电梯。你的初始位置在A层,有个神秘实验室在B层,所以你的移动会受到如下限制:假设你在x层,你能走到的y层都要满足 |x - y| < |x - b|. 你不能走到B层或者留在原地。问一共走K次,有多少种走法。(n,k le 5000)

    Solution

    前缀和优化 dp

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    int n, a, b, k;
    int f[5005], s[5005];
    
    const int mod = 1e9 + 7;
    
    signed main()
    {
        ios::sync_with_stdio(false);
        cin >> n >> a >> b >> k;
        s[a] = 1;
        for (int i = 1; i <= k; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (j < b)
                    f[max(1ll, 2 * j - b + 1)] += s[j];
                if (j < b)
                    f[b] -= s[j];
                if (j > b)
                    f[b + 1] += s[j];
                if (j > b && 2 * j - b <= n)
                    f[2 * j - b] -= s[j];
            }
            for (int j = 1; j <= n; j++)
                f[j] = (f[j] % mod + mod) % mod;
            for (int j = 1; j <= n; j++)
                f[j] += f[j - 1];
            for (int j = 1; j <= n; j++)
                f[j] -= s[j];
            for (int j = 1; j <= n; j++)
                f[j] = (f[j] % mod + mod) % mod;
            for (int j = 0; j <= n; j++)
                s[j] = f[j], f[j] = 0;
        }
        int ans = 0;
        for (int i = 1; i <= n; i++)
            ans += s[i];
        cout << ans % mod << endl;
    }
    
  • 相关阅读:
    CF 13B Letter A
    CF12D Ball
    题解 CF11C
    CF10E Greedy Change
    CF10D LCIS&&Acwing 272
    CF10C Digital Root
    yLOI2019 青原樱
    js有关时间日期的操作
    js 读取 cookie
    nginx有关.htaccess小结
  • 原文地址:https://www.cnblogs.com/mollnn/p/14482345.html
Copyright © 2011-2022 走看看