LightOJ 1140: How Many Zeroes? (数位DP)
当前数位DP还不理解的点:
1:出口用i==0的方式
2:如何省略状态d(就是枚举下一个数的那个状态。当然枚举还是要的,怎么把空间省了)
总结:
1:此类DP,考虑转移的时候,应当同时考虑查询时候的情况。
2:考虑x在第i位之后,能遍历多少数字,其答案为(x%10i-1+1)
3:这里的记忆化搜索不太一样喔,出口一定要写在递归里,不然,查询状态下差到出口就会出错了~
类型:
数位DP
题意:
求[A,B]区间内的所有数,写下来之后,0的个数。(a,b 为 unsigned int)
思路:
我的笨拙暴力状态:
dp[i][d][okPre] 表示d开头的i位数,(okPre表示计算前导0的情况下,反之~),的0的个数。
那么。
dp[i][d][含] = dp[i-1][0~9(num[i-1])][含] + 10i-1(x%10i-1+1) * (d==0);
dp[i][d][不含] = dp[i-1][1~9(num[i-1])][含] + dp[i-1][0][d==0?不含:含] ;
出口:
dp[1][1~9][含] =dp[1][1~9][不含] = 0;
dp[1][0][不含] = dp[1][0][含] = 1;
当时确定出口的时候,不含的0应该是0还是1呢?不好确定,感觉是1,最后是通过试验确定的。
还是没有理解别人代码中 用 i==0 做出口 是怎么实现的。
我的代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; long long nowx;
long long dp[][][];
int num[]; long long dfs(int i, int d, bool okPreZero, bool isQuery) {
//printf("(%d,%d,%s,%s)\n", i, d, okPreZero?"T":"F", isQuery?"T":"F");
long long &nowdp = dp[i][d][okPreZero];
if (!isQuery && ~nowdp) return nowdp;
if (i == ) {
if (d!=) return nowdp = ;
else if (okPreZero) {
return nowdp = ;
} else {
return nowdp = ;
}
}
long long ans = ;
int end = isQuery?num[i-]:;
for (int j = ; j <= end; j++) {
if (okPreZero) {
ans += dfs(i-,j,true,isQuery && j==end);
} else {
if (d == && j == ) {
ans += dfs(i-,j,false,isQuery && j==end);
} else {
ans += dfs(i-, j, true, isQuery && j==end);
}
}
}
long long ten = ;
for (int j = ; j < i-; j++) ten*=;
if (d== && okPreZero) ans += (isQuery?((nowx%ten)+):(ten));
if (!isQuery) nowdp = ans;
return ans;
} long long cal(long long x) {
nowx = x;
if (x == -) return ;
if (x == ) return ;
int len = ;
while (x) {
num[++len] = x%;
x/=;
}
return dfs(len+, , false, true);
} int Nmain() {
long long a;
memset(dp, -, sizeof(dp));
while (cin>>a) {
cout<<"---"<<cal(a)<<endl;
}
return ;
} int main() {
int t;
cin>>t;
int cas = ;
memset(dp, -, sizeof(dp));
while (t--) {
long long m, n;
cin>>m>>n;
cout<<"Case "<<cas++<<": "<<cal(n)-cal(m-)<<endl;
}
return ;
}
不理解的代码:
#include<cstdio>
#include<cstring>
#include<cmath>
typedef long long LL;
LL dp[][][];
int bit[],len;
LL a,b;
LL dfs(int pos,int v,int flag,int limit)
{
if (pos<=) return flag?v:;
if (!limit&&dp[pos][v][flag]!=-) return dp[pos][v][flag];
int end=(limit?bit[pos]:);
LL re=;
for (int i=;i<=end;i++)
{
int tmp;
if (flag&&(i==)) tmp=;else tmp=;
re+=dfs(pos-,v+tmp,flag||i,limit&&(end==i));
}
if (!limit) dp[pos][v][flag]=re;
return re;
} LL solve(LL n)
{ if (n==-) return -;
if (n==) return ;
len=;
while (n)
{ bit[++len]=n%;
n/=;
}
return dfs(len,,,);
}
int main()
{ memset(dp,,sizeof(dp));
int cas,i=;
scanf("%d",&cas);
while (cas--)
{scanf("%lld%lld",&a,&b);
printf("Case %d: %lld\n",++i,solve(b)-solve(a-));
}
return ;
}
LightOJ 1140: How Many Zeroes? (数位DP)的更多相关文章
- LightOJ 1140 How Many Zeroes? (数位DP)
		
题意:统计在给定区间内0的数量. 析:数位DP,dp[i][j] 表示前 i 位 有 j 个0,注意前导0. 代码如下: #pragma comment(linker, "/STACK:10 ...
 - light oj 1140 - How Many Zeroes?  数位DP
		
思路:dp[i][j]:表示第i位数,j表示是否有0. 代码如下: #include<iostream> #include<stdio.h> #include<algor ...
 - UVALive - 6575 Odd and Even Zeroes 数位dp+找规律
		
题目链接: http://acm.hust.edu.cn/vjudge/problem/48419 Odd and Even Zeroes Time Limit: 3000MS 问题描述 In mat ...
 - LightOJ 1032 - Fast Bit Calculations 数位DP
		
http://www.lightoj.com/volume_showproblem.php?problem=1032 题意:问1~N二进制下连续两个1的个数 思路:数位DP,dp[i][j][k]代表 ...
 - lightoj 1021 - Painful Bases(数位dp+状压)
		
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...
 - LightOJ 1140  How Many Zeroes
		
题意:写出一个给定区间的每个数,求出一共写了多少个零. 解法:数位DP,定义dp[len][flag][num]:len的定义为数位的长度,flag定义为前导0和没有前导0的两种状态,num定义为写的 ...
 - lightoj 1140 - How Many Zeroes?(数位dp)
		
Jimmy writes down the decimal representations of all natural numbers between and including m and n, ...
 - LightOJ - 1140 统计0的数位 数位DP
		
注意以下几点: 搜索维度非约束条件的都要记录,否则大概率出错,比如_0 st参数传递和_0的互相影响要分辨清楚 num==-1就要返回0而不是1 #include<iostream> #i ...
 - 数位dp(D - How Many Zeroes? LightOJ - 1140 )
		
题目链接:https://cn.vjudge.net/contest/278036#problem/D 题目大意:T组测试数据,每一次输入两个数,求的是在这个区间里面,有多少个0,比如说19203包括 ...
 
随机推荐
- NOIP模拟赛 篮球比赛1
			
篮球比赛1(basketball1.*) Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛.为了保持比赛公平,Czhou要将神牛们分成两队.首先神牛们赛前都要排成固定的队伍:然 ...
 - 【linux】服务说明
			
引用自<鸟哥的linux私房菜> http://cn.linux.vbird.org/linux_server/0210network-secure_3.php 服务名称 服务内容 a ...
 - crm项目之整体内容(一)
			
一.项目背景 YW公司是一家电池供应商,目前由于公司内部的需要,需要做一个CRM项目,需要每一个不同角色的员工登陆系统后处理自己的事情.其流程大致如下: 其项目包括三部分内容: 1.权限分配组件(rb ...
 - 关于使用Java实现的简单网络爬虫Demo
			
什么是网络爬虫? 网络爬虫又叫蜘蛛,网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直 ...
 - OverflowError:django signed integer is greater than maximum
			
在学习一对一查询的时候,打印作者的电话时报了这个错 alex = Author.objects.filter(name='alex').first() print(alex.authordetail. ...
 - UVA - 1220 Party at Hali-Bula (树形DP)
			
有 n 个员工,n-1个从属关系. 不能同时选择某个员工和他的直接上司,问最多可以选多少人,以及选法是否唯一. 树上的最大独立集问题.只不过多了一个判断唯一性. dp[u][0]表示不选这个点的状态, ...
 - FCKeditor自定义编辑区CSS样式
			
在网站后台使用FCKeditor编辑器的时候,见到的效果可能并不完全是”所见即所得”的,因为如果在FCKeditor编辑区中使用了前台样式表中的样式,在编辑区中并不能把这些样式显示出来.解决这个问题的 ...
 - Spring core resourc层结构体系及JDK与Spring对classpath中资源的获取方式及结果对比
			
1. Spring core resourc层结构体系 1.1. Resource相关结构体系 1.2. ResourceLoader相关体系 2. JDK与Spring对classpath中资源的获 ...
 - [python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)
			
关键字参数和位置参数是在函数调用的时候定义 关键字参数是以键-值对出现,无序,多一个不行,少一个不行 位置参数,有序,多一个不行,少一个不行 混搭:所有位置参数必须在关键字参数的左边 默认参数是在函数 ...
 - ACM-ICPC 2018 沈阳赛区网络预赛 J树分块
			
J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...