首页 > 其他分享 >【数位DP】计数问题

【数位DP】计数问题

时间:2023-03-21 14:46:57浏览次数:42  
标签:10 nums int res 计数问题 power10 DP 数位

image

导读 ^ _ ^

数位DP

数位DP,即是对数的每一位进行统计操作的DP问题。

计数问题

image.png

思路(分类讨论)

首先,如果一遍遍枚举,显示是不行的,因为1e8次这样,明显会超时。
这类问题的关键是分类讨论,以及如何去从划分的角度思考问题。
这样一思考,我们的复杂度降至 :
10 (统计数) * 2(划分数)* 8(位数)* 1000(前导枚举数) = 160000。
image.png

进行分类讨论:

如下可知,我们要实现一个count的函数,以及一个power10函数。
最终对结果进行累加即可。
image.png

代码实现

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int power10(int x) {
    //int res = 0;//这求幂得1啊!
    int res = 1;
    while(x--) res *= 10;
    return res;
}

int getnum(vector<int>& nums, int l,int r) {
    int res = 0;
    for(int i = l; i >= r; i--) 
        res = res*10 + nums[i];
    return res;
}

int count (int n, int x) {
    
    if(n == 0) return 0; //我们从1开始算的 
    
	vector<int> nums;
	while(n) {
		nums.push_back(n%10);
		n /= 10;
	}
	
	n = nums.size();
	int res = 0;

	//从最高位开始枚举,如果查找的x为0,从第二位开始!x,并作处理。
	for (int i = n - 1 - !x; i >= 0; i--) {
		if(i < n - 1) {
            res += getnum(nums,n-1,i+1) * power10(i);
            if(!x) res -= power10(i);//去掉前导0
        }
        if(nums[i] == x) res += getnum(nums,i-1,0) + 1;
        else if(nums[i] > x)res += power10(i);
	} 

    return res;
}

int main ( ) {
	int a,b;
	while (cin >> a >> b, a||b) {
		if (a > b ) swap(a,b);//坑人的地方。
		
		for (int i = 0; i <= 9; i++) 
		   cout << count(b,i) - count(a-1,i) <<" ";
		cout << endl;
	}
	
	return 0;
} 

#谢谢你的观看!

^ _ ^

标签:10,nums,int,res,计数问题,power10,DP,数位
From: https://www.cnblogs.com/HX-Note/p/17239931.html

相关文章

  • DP 与 DDP
    前言​ DP与DDP均为GPU并行手段,目的是加快训练。DP(Dataparallelism)如上图所示:DP其实只开了一个线程,并行算法实在多个设备上都拷贝了一份完整的模型参数,彼此之......
  • udp编程实例1
    #include<signal.h>#include<stdio.h>#include<errno.h>#include<unistd.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<arpa/inet.h>......
  • 「线性DP」乘积最大
    本题为3月20日23上半学期集训每日一题中A题的题解题面题目描述今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚......
  • 【洛谷】P4590 [TJOI2018]游园会(dp套dp)
    原题链接题意对于一个长度为\(n\)的仅由\(N,O,I\)组成且不包含字串\(NOI\)的字符串\(S\),其与一个给定的长度为\(K\)的字符串的最长公共子序列为\(LCS\)。求出......
  • wordpress外贸站,采用astra ,woocommerce,weglot等
              翻译搜索复制......
  • #创作者激励#[触觉智能RK3568]修改屏幕 DPI(像素密度)
    【本文正在参加2023年第一期优质创作者激励计划】(目录)触觉智能RK3568购买链接如下:https://item.taobao.com/item.htm?spm=4645b.1.14.1.5c4a4a7dv1soeZ&id=6587890390......
  • go 实现udp通信
    go实现udp通信 udp:不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。服务端实现代码:......
  • 【洛谷】P2150 [NOI2015] 寿司晚宴(状压dp+根号分治)
    原题链接题意有序列\(2,3,4\cdotsn\),对于序列中的每一个数,它可以被放入两个集合中的任意一个,或者不选。最后需要满足两个集合间的数两两互质(集合内部的数不需要满足互......
  • 树形dp注意事项
    1.树形dp的for循坏能优化就优化,比如取j=min(size[x],m),k<=min(size[x],m)之类的,否则很容易TLE2.要考虑清楚不合法状态是否会对答案产生影响,如果有就要memset(dp,-1,s......
  • 基础dp
    珂爱的dp们区间dp在\(dp\)的状态设计中,设计以区间为状态的\(dp\)或以区间为阶段进行的\(dp\)即为区间\(dp\),一般有最值问题和计数问题,一般方程为\[f[l][r][.........