1 条题解

  • 1
    @ 2024-3-25 21:52:10

    【2022年省赛B组】试题I: 李白打酒加强版

    题解

    由于N,MN,M的最大值为100,要满足题目要求——在最后一次将酒喝完,则说明就得上限不会超过MM。总共存在N+MN+M次相遇,每次相遇存在两种可能性,如果暴力枚举所有可能性,时间复杂度为2N+M2^{N+M}, 则无法通过。 每次相遇存在两种情况,最终需要经过NN次店,MM次花,这个约束和背包问题很类似。考虑能否使用动态规划进行优化。 在背包问题中,每件物品存在"取"和"不取"两种可能,取之后根据物品的体积和价值进行更新。 此处对应着相遇是否为“店”和“花”

    • 如果是花,则花的数量+1, 酒-1;
    • 如果是店,则店的数量+1, 酒×2\times 2。 因此定义dp[i][j][k]dp[i][j][k]表示第ii次相遇,每次相遇需要维护店的数量jj(或者花的数量iji - j, 维护其中一个即可)。酒量为kk的方案数。

    题目要求的是“遇到店NN次,遇到花MM次, 最后一次遇到的是花,正好把酒喝光”的方案数。也就相当于在前N+M1N+M-1次中,遇到店NN次, 酒量为1的方案数(dp[N+M1][N][1])(dp[N+M-1][N][1]),因为此时最后遇到花才能恰好喝完。

    接下来考虑dpdp数组的动态转移方程:

    • 初始时从家中出来有2斗酒,可以表示为边界情况dp[0][0][2]=1dp[0][0][2] = 1
    • 如果第ii次相遇为花,则dp[i][j][k]dp[i][j][k]可以由dp[i1][j][k+1]dp[i-1][j][k + 1]转移过来,相当于前i1i - 1次相遇中遇到店铺为jj次、酒量为k+1k + 1, 第ii次为花则店铺数量不变,酒量数量减一;
    • 如果第ii次相遇为店,则dp[i][j][k]dp[i][j][k]中的kk必须为偶数,此时从dp[i1][j1][k/2]dp[i - 1][j - 1][k / 2]转移过来。 根据上述分析,可以根据kk的奇偶性和转移方程更新dpdp数组。 实现时注意防止计算溢出。

    提交代码

    #include<bits/stdc++.h>
    #define int long long
    const int N = 100 + 10, mod = 1e9 + 7;
    int dp[2 * N][N][N];
    
    void solve()
    {
        int n, m; std::cin >> n >> m;
        
        
        dp[0][0][2] = 1;
        for(int i = 1; i <= n + m - 1; i++)
        {
            for(int j = 0; j <= n; j++)
            {
                for(int k = 0; k <= m; k++)
                {
                    if(k % 2 == 0 && j)
                    {
                        dp[i][j][k] = (dp[i - 1][j][k + 1] + dp[i - 1][j - 1][k / 2]) % mod;
                    }
                    else
                    {
                        dp[i][j][k] = dp[i - 1][j][k + 1];
                    }
                }
            }
        }
        
        std::cout << dp[n + m - 1][n][1] << "\n";
    }
    signed main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        int t = 1;
        while(t--) solve();
        return 0;
    }
    
    • 1

    【2022年省赛B组】试题I: 李白打酒加强版

    信息

    ID
    974
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    22
    已通过
    8
    上传者