数位dp中的前导0处理 AcWing 1084. 数字游戏 II

若数位dp中的数字性质要求数字不含前导0,则可以考虑。

dp数组中保留存在前导0的数字种类。

在遍历每一位时,第一位从1开始,其他位从0开始。

然后再把位数低于当前数字的结果(不含前导0)累加。

(含有前导0时,则可以遍历每一位时都从0开始,最后也不用累加结果)

(如果数字是否含有前导0对结果(数字的性质)不影响,则两种方法均可,比如1082数字游戏,前导0就会影响,1084数字游戏II就不会影响)

AcWing 1084. 数字游戏 II

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a, b, mod;
LL dp[10][15][100];//digit len remain
LL sum[15];
LL Count(LL num)
{
    string str = to_string(num);
    LL res = 0;
    LL last = 0;
    for (int i = 0; i < str.size(); i++)
    {
        int num = str[i] - '0';
        for (int j = (i==0); j < num; j++)
            res += dp[j][str.size()-i][(mod - (last) % mod)%mod];
        last += num;
    }
    if (last%mod == 0) res++;
    for (int i = 1; pow(10, i) <= num; i++)
        res += sum[i];
    return res;
}
void YD()
{
    while (cin >> a >> b >> mod)
    {
        memset(dp, 0, sizeof(dp));
        memset(sum, 0, sizeof(sum));
        for (int i = 0; i < 10; i++)
            dp[i][1][i%mod] = 1;
        for (int len = 2; len <= 10; len++)
        {
            for (int i = 0; i < 10; i++)
            {
                for (int r = 0; r < mod; r++)
                {

                    for (int j = 0; j < 10; j++)
                    {
                        dp[i][len][r] += dp[j][len - 1][(r + 2 * mod - i) % mod];
                    }
                }

            }
        }

        for (int i = 1; i <= 10; i++)
        {
            for (int j = 1; j < 10; j++)
                sum[i] += dp[j][i][0];
        }
        sum[1] += dp[0][1][0];

        cout << Count(b) - Count(a - 1) << endl;
    }


}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    //cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code
复制代码

 

posted @   80k  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示