数位dp-acwing(数字游戏)

news/2024/12/23 16:25:10 标签: 算法, 动态规划, leetcode

题目:数字游戏

1082. 数字游戏 - AcWing题库

分析:

前缀和思想: dp(m) - dp(n-1)

用树的角度分析。

比最高位小的, 左分支讨论,等于最高位的进入右分支,(同时进入右分支有条件,就是当前位最大值last <= x(下一位值,此高位).

对于左分支,随便弄,只要后面的大于前面的就行(不会超过n的值)=>这个东西提前算好了,就是f[i][j] i位数,最高位是j,这种情况下满足性质有几位。

符合条件进入右分支。

如果能枚举完,还要加上特殊情况(ans ++);

代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 20;
int f[N][N];

void init() {
    for(int i = 0; i <= 9; i ++) f[1][i] = 1;
        
    for(int i = 2; i < N; i ++)  // 位数
        for(int j = 0; j <= 9; j ++)  // 最高位是多少
            for(int k = j; k <= 9; k ++) // 比最高位大
                f[i][j] += f[i-1][k]; // 下一位>=j的全加起来
}

int dp(int n) {
    // 特判n == 0,只有0这一种情况,因为n=0 后面循环无法通过存储nums
    if(!n) return 1;
    
    vector<int> nums;
    while(n) nums.push_back(n%10), n/=10;
    
    int ans = 0, last = 0; // 存上一个最大值
    for(int i = nums.size()-1; i >=0; i --) {
        int x = nums[i];
        // 进入右分支条件: x >= last
        // j >= last
        for(int j = last; j < x; j ++) {
            ans += f[i+1][j];
        }
        
        if(last>x) break;
        last = x;
        // 右子树进入到最后一个右分支,特殊处理(算一种情况)
        if(!i) ans ++;
    }
    return ans;
}

int main() {
    int n, m;
    
    init();
    
    while(cin >> n >> m) cout << dp(m) - dp(n-1) << endl;
    
    return 0;
}


http://www.niftyadmin.cn/n/5796751.html

相关文章

【C语言】动态内存管理:详解malloc和free函数

前言 在C语言编程中&#xff0c;动态内存分配是一个非常重要的概念。与静态内存分配不同&#xff0c;动态内存分配允许程序在运行时根据需要分配和释放内存&#xff0c;从而更加灵活地管理内存资源。特别是在一些数据结构的引用中经常需要使用&#xff0c;下面我们就详细讲解一…

LeetCode 583. 两个字符串的删除操作 java题解

https://leetcode.cn/problems/delete-operation-for-two-strings/ 用最长公共子序列的做法。先求出他两的最长公共子序列&#xff0c;这部分是要保留的。字符串中除了这部分的字符&#xff0c;其他字符都需要删除。 class Solution {public int minDistance(String word1, St…

linux----文件访问(c语言)

linux文件访问相关函数 打开文件函数 - open 函数原型&#xff1a;int open(const char *pathname, int flags, mode_t mode);参数说明&#xff1a; pathname&#xff1a;这是要打开的文件的路径名&#xff0c;可以是绝对路径或者相对路径。例如&#xff0c;"/home/user/…

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …

tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录

目录 tslib的简介tslib的源码和make及make install后得到的文件下载tslib的主要功能tslib的工作原理tslib的核心组成部分tslib的框架和核心函数分析tslib的框架tslib的核心函数ts_setup()的分析(对如何获取设备名和数据处理流程的分析)函数ts_setup()自身的主要代码ts_setup()对…

材料性质预测、分子生成、分类等研究方向的大语言模型构建与应用

流程 数据准备 收集和预处理大规模材料相关数据集。格式化数据以适应模型输入。 模型预训练 基于Transformer架构进行大规模无监督预训练。任务&#xff1a;掩码语言模型&#xff08;MLM&#xff09;或自回归生成任务。 任务微调 针对特定任务&#xff08;性质预测、分子生成、…

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具&#xff1a; DockerDocker ComposeOpenSSL&#xff08;用于生成证书&#xff09;#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker&#xff0c;可以参考以下命令安装&…

15款行业大数据报告下载网站

1、CAICT中国信通院 http://www.caict.ac.cn/ 国家高端产业智库&#xff0c;研究报告免费下载PDF版本。 2、阿里研究院 http://www.aliresearch.com/ 阿里出品&#xff0c;阿里相关产品数据报告。 3、企鹅智库 https://re.qq.com/ 腾讯旗下数据报告。 4、CBNData https:…