首页 > 其他分享 >P2602 [ZJOI2010] 数字计数:数位DP

P2602 [ZJOI2010] 数字计数:数位DP

时间:2023-02-21 12:55:05浏览次数:45  
标签:int ll pos ZJOI2010 vector P2602 include data DP

https://www.luogu.com.cn/problem/P2602

// #include <iostream>
// #include <iomanip>
// #include <unistd.h>
// #include <climits>
// #include <string>
// #include <stdlib.h>
// #include <cstdio>
// #include <fcntl.h>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;

ll num(vector<int>& data, int pos)
{
	ll t = 0;
	while(pos >= 0)
	{
		t *= 10;
		t += data[pos--];
	}
	return t;
}

ll dfs(vector<vector<vector<ll>>>& dp,
	vector<int>& data, int pos, int x, bool limit, bool zero)
{
	if(pos == -1)	//没有数字,贡献x零次
		return 0;
	if(dp[pos][limit][zero] != -1)
		return dp[pos][limit][zero];
	int up = limit ? data[pos] : 9;
	ll ret = 0;
	for(int i = 0; i<=up; ++i)
	{
		ret += dfs(dp, data, pos-1, x, limit&&i==data[pos], zero&&i==0);	//不管什么情况都要计算后边贡献x的次数

		//当当前位置等于x,要计算当前位置贡献x的次数
		if(i == x)
		{
			if(limit && i==data[pos])	//limit的情况下不可能有前导零
				ret += num(data, pos-1) + 1;
			else if(!(zero && i==0))	//当有前导零并且当前位置也是0,就不加pow(10, pos);
				ret += pow(10, pos);
		}
	}
	return dp[pos][limit][zero] = ret;
}

ll solve(ll a, int x)
{
	vector<int> data(0);
	while (a)
	{
		data.push_back(a%10);
		a/=10;
	}
	int len = data.size();
	vector<vector<vector<ll>>> dp(len, vector<vector<ll>>(2, vector<ll>(2, -1)));
	return dfs(dp, data, len-1, x, true, true);
}
int main()
{
	ll L, R;
	cin >> L >> R;
	if(L > R) swap(L,R);
	
	for(int i = 0; i < 10; ++i)
	{
		cout << solve(R, i) - solve(L-1, i)  << (i==9?"":" ");
	}
	return 0;
}

标签:int,ll,pos,ZJOI2010,vector,P2602,include,data,DP
From: https://www.cnblogs.com/hellozhangjz/p/17140586.html

相关文章

  • TCP与UDP简述
    什么是TCPTCP(TransmissionControlProtocol传输控制协议)是一种面向连接的,可靠的,基于字节流的传输通信协议。1、tcp(TransmissionControlProtocol传输控制协议)2、传......
  • BZOJ 4145 [AMPPZ2014]The Prices (状压DP)
    题意你要购买商店,你到第i家商店的路费为,在第家商店购买第种物品的费用为,求最小总费用。分析很容易定义出状态,表示到第行,买的物品情况为的最小费用。按照往常的套路是转移时......
  • [oeasy]python0089_大型机的衰落_Dec小型机崛起_PDP_VAX网络
    编码进化回忆上次内容上次回顾了计算机存储单位的演变最小的读写单位是bit8-bit固定下来成为了字节(Byte)位数容量8-bit1Byte1024Byte......
  • Atcoder Educational DP Contest
    序言dp的水平太......
  • UDP 和 TCP? 区别? 应用场景?
    一、UDPUDP(UserDatagramProtocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层也......
  • ThreadPool线程池工具类
    packagecom.rc.openapi.util;importcom.google.common.util.concurrent.ThreadFactoryBuilder;importjava.util.concurrent.*;publicclassThreadPoolService{/**......
  • 规则LDPC和不规则LDPC译码算法MATLAB仿真
    up目录一、理论基础二、核心程序三、测试结果一、理论基础LDPC码是根据低密度稀疏校验矩阵H来构造的。假设需要发送一组信息T{t_1,t_2,⋯,t_n},在发送前先使用生成矩......
  • m基于LS+变步长LMS的Volterra级数数字预失真DPD系统matlab仿真
    1.算法描述DPD是数字预失真的首字母缩写,许多射频(RF)工程师、信号处理爱好者和嵌入式软件开发人员都熟悉这一术语。DPD在蜂窝通信系统中随处可见,使功率放大器(PA)能够有效地为......
  • ScheduledThreadPoolExecutor的基本使用和源码解读
    1基本使用ScheduledThreadPoolExecutor是一种特殊的线程池,它可以执行延迟任务和定时任务。首先,通常会在全局范围内创建线程池对象,可以是静态变量,或者Spring单例对象:Thr......
  • Educational DP Contest - J - Sushi
    定义\(dp[i][j][k]\)是初始情况为:总共有n个盘子,其中\(i\)个盛有1个寿司的盘子,\(j\)个盛有2个寿司的盘子,\(k\)个盛有3个寿司的盘子,在这种初始情况下将寿司全部吃完的期望......