P2602 [ZJOI2010] 数字计数

感悟

学算法不能背板子 , 板子不理解就没法应对多变的题目

可以看题解

但是看题解之后要写出不一样的代码

才能证明真的掌握

要思考为什么要设置这些变量 , 从功能性的角度看每个变量都有其存在的价值

然后想能不能替换 , 能不能改掉 , 能不能省略

这样才算真的掌握了一道题

题意

数位 dp , 求范围内各个数码出现次数

思路

前导零显然需要的 , limit 显然需要的

dfs 过程中 , 当前为前导零并且遍历到 0 时 , 实际上是类似 000256 的结构 , 0 个数还是 0

思路很明确 , 在实现代码的时候出现了一些小问题

我设置了结构体 tenNo 来记录10个数字 , 然而在写记忆化的时候 , 发现写不了 unordered_map 写不了算法

问了下 AI 给了我一个 hash 函数

等下再写篇博客记那个 hash 函数

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long int
inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
const int N = 20;
int a[N];
int f[N][N][10];
int dfs(int pos,bool limit,bool lead,int digit,int sum) {
    if (!pos)
        return sum;
    if (!limit && !lead && ~f[pos][sum][digit])
        return f[pos][sum][digit];
    int up = limit?a[pos]:9;
    int res = 0;
    for (int i = 0; i<= up; i++) {
        int tmp= sum + (digit==i);
        if (lead && i==0 && digit==0)
            tmp = 0;
        res += dfs(pos-1,limit&&i==up,lead && i==0,digit,tmp);
    }
    if (!limit && !lead)
        f[pos][sum][digit] = res;
    return res;
}
int ans[10];
void solve(int x,int f) {
    int cnt= 0 ;
    do {
        a[++cnt] = x%10;
        x/=10;
    }while (x);
    for (int i = 0; i < 10; i++) {
        int res = dfs(cnt,true,true,i,0);
        ans[i] += res * f;
    }
}

signed main() {
    memset(f,-1,sizeof f);
    int a= read(),b=read();
    solve(b,1);
    solve(a-1,-1);
    for (int i= 0; i< 10; i++)
        cout<<ans[i]<<" ";
    return 0;
}

posted @   Guaninf  阅读(6)  评论(0)    收藏  举报
编辑推荐:
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
· 一则复杂 SQL 改写后有感
· golang中写个字符串遍历谁不会?且看我如何提升 50 倍
· C# 代码如何影响 CPU 缓存速度?
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
阅读排行:
· 一则复杂 SQL 改写后有感
· 接口被刷百万QPS,怎么防?
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
· 一个开源免费、功能丰富的 WPF 自定义控件资源库
· 提升Avalonia UI质感,跨平台图标库选型实践
点击右上角即可分享
微信分享提示