AcWing 1083. Windy数 数位dp例题

此题中,dp数组保存存在前导0的windy数(因为在使用时,当前位的前面会存在非0数)

结果为不存在前导0的windy数(循环过程中第一次不包含0)。

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL dp[15][15];//i起头,长度为j
LL sum[15];
LL DP(int num, int len)
{
    return dp[num][len];
}
LL Count(LL num)
{
    string nums = to_string(num);
    LL res = 0;
    int prev = -10;
    for (int i = 0; i < nums.size(); i++)
    {
        int num = nums[i] - '0';
        

        for (int j = (i==0?1:0); j < num; j++)
        {
            if (abs(j - prev) >= 2)
                res += DP(j, nums.size() - i);
        }
        if (abs(num - prev) < 2)
            break;
        if (i == nums.size() - 1)
            res++;
        prev = num;
    }
    for (int i = nums.size() - 1; i >= 1; i--) res += sum[i];
    return res;
}
void YD()
{
    LL a, b;
    for (int i = 0; i < 10; i++) {
        dp[i][1] = 1;
    }

    for (int j = 2; j <= 11; j++)
    {
        for (int i = 9; i >= 0; i--)
        {
            for (int k = 0; k < 10; k++)
            {
                if (abs(i - k) >= 2)
                    dp[i][j] += dp[k][j - 1];
            }
        }
    }

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

    cin >> a >> b;

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