首页 > 其他分享 >不要62

不要62

时间:2022-09-20 15:47:15浏览次数:60  
标签:pre 不要 int res pos 62 include

数位DP

原题链接

题目描述:
计算[l, r]中不含数字62且不包含数字4的数的总个数

状态定义:
f[i][j]表示共有 i 位,且最高位为 j 的合法方案数
假设 kj 后面的数字,则状态转移:

\[f_{i,j}=\sum_{k=0}^9{f{_{i-1},_k}},(j\neq4,k\neq4,jk不同时为62) \]

Code

#include <iostream>
#include <cstring>
#include <vector>

const int N = 15;

int f[N][10];

void init() {
    for (int i = 0; i <= 9; i ++ ) 
        if (i != 4) f[1][i] = 1;
    for (int i = 2; i < N; i ++ )
        for (int j = 0; j <= 9; j ++ ) {
            if (j == 4) continue; // 不合法状态直接continue
            for (int k = 0; k <= 9; k ++ ) {
                if (k == 4 || j == 6 && k == 2) continue;
                f[i][j] += f[i - 1][k];
            }
        }
}

int cal(int n) {
    if (!n) return 1;
    std::vector<int> nums;
    while (n) nums.emplace_back(n % 10), n /= 10;
    
    int res = 0, pre = 0;
    for (int i = nums.size() - 1; i >= 0; i -- ) {
        int x = nums[i];
        for (int j = 0; j < x; j ++ ) {
            if (j == 4 || pre == 6 && j == 2) continue;
            res += f[i + 1][j];
        }
        
        if (x == 4 || pre == 6 && x == 2) break; // 说明不存在右分支,直接break
        pre = x;
        
        if (!i) res ++ ;
    }
    
    return res;
}

int main() {
    init();
    
    int l, r;
    while (std::cin >> l >> r, l || r) 
        std::cout << cal(r) - cal(l - 1) << '\n';
    return 0;
}

记忆化搜索

#include <iostream>
#include <cstring>

const int N = 15;

int a[N];
int f[N][N];

// pos:当前第几位
// pre:上一位是几
// limit:当前位是否有限制
int dfs(int pos, int pre, bool limit) {
    if (!pos) return 1;
    if (!limit && ~f[pos][pre]) return f[pos][pre];
    int res = 0, up = limit ? a[pos] : 9;
    for (int i = 0; i <= up; i ++ ) {
        if (i == 4 || pre == 6 && i == 2) continue;
        res += dfs(pos - 1, i, limit && i == up);
    }
    return limit ? res : f[pos][pre] = res;
}

int cal(int n) {
    memset(f, -1, sizeof f);
    int len = 0;
    while (n) a[++ len] = n % 10, n /= 10;
    return dfs(len, 0, 1);
}

int main() {
    int l, r;
    while (std::cin >> l >> r, l || r) 
        std::cout << cal(r) - cal(l - 1) << '\n';
    return 0;
}

标签:pre,不要,int,res,pos,62,include
From: https://www.cnblogs.com/zjh-zjh/p/16711252.html

相关文章

  • 如何使用Vue原生组件编译应用程序主题?这个工具不要错过
    KendoUI致力于新的开发,来满足不断变化的需求。KendoUIforVue使用旨在提高性能和丰富用户体验的Vue组件,帮助开发人员构建下一代应用程序。它是为Vue技术框架提供可用的K......
  • ASR6500S SIP模块与SX1262系列集成替代SX1278 SX1262内核+RF前端
    ASR6500S是一系列LoRaSIP模块,集成了RF前端和LoRa无线电收发器SX1262系列,支持LoRa和FSK调制。LoRa技术是一种针对LPWAN应用的低数据速率、超远程、超低功耗通信进行优化的......
  • leetcode 622.设计循环队列
    622.设计循环队列难度中等402  设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它......
  • 都2022年了!!!不要再用Setting Sync插件来同步VScode的配置了!!!
    推荐使用设置同步。需要之前电脑的VScode的版本与新电脑的版本相同这里有可能报无法更新的错误,只要找到报错的那个文件夹,将下面名称为_的文件夹的内容移到上一级目录......
  • 学习python-Day62
    今日学习内容具体项目:D:\pythonProject\django_day60登录界面搭建<divclass="container-fluid"><divclass="row"><divclass="col-md-6col-md-offse......
  • 1624. 两个相同字符之间的最长子字符串
    1624.两个相同字符之间的最长子字符串给你一个字符串s,请你返回两个相同字符之间的最长子字符串的长度,计算长度时不含这两个字符。如果不存在这样的子字符串,返回-1......
  • 《痞子衡嵌入式半月刊》 第 62 期
    痞子衡嵌入式半月刊:第62期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:Ja......
  • 安装老版本的 typora (不要钱)
    1.下载老版本的typora我是从太平洋电脑网下载的,https://dl.pconline.com.cn/download/2853408-1.html另外我也放在百度网盘了:链接:https://pan.baidu.com/s/1tGmSYX......
  • AtCoder Beginner Contest 262(D-E)
    D-IHateNon-integerNumber题意:一个长度为n的数组,选择其中的x项,问其中有多少种选择,这x项的和可以被选择的数目整除,比如,选择3个数,和为6,那么6/3=2,就可以被整除。题解:......
  • 洛谷P1262 间谍网络(tarjan求强连通分量+缩点)
    题目链接:https://www.luogu.com.cn/problem/P1262思路:首先,我们能够知道,入读为0的点如果不能被收买的话,那么此题是无解的。其次,如果图中存在环的话,那么环中每个点的......