HDU 5898 odd-even number 数位DP
2016-09-18 19:22
375 查看
odd-even number
[align=left][b]Problem Description[/b][/align][align=left] [/align]
For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18).
[b]Input[/b]
First line a t,then t cases.every line contains two integers L and R.
[align=left][b]Output[/b][/align]
[align=left] [/align]
Print the output for each case on one line in the format as shown below.
[align=left][b]Sample Input[/b][/align]
[align=left] [/align]
2
1 100
110 220
[align=left][b]Sample Output[/b][/align]
[align=left] [/align]
Case #1: 29
Case #2: 36
![](https://images2015.cnblogs.com/blog/786903/201609/786903-20160918192058919-184675200.png)
基础的数位DP
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1 #define mid ((ll+rr)>>1) #define pii pair<int,int> #define MP make_pair typedef long long LL; const long long INF = 1e18; const double Pi = acos(-1.0); const int N = 600+10, M = 1e2+11, mod = 1e9+7, inf = 0x3fffffff; LL L,R,dp[80][2][80][2],vis[80][2][80][2]; int d[80]; long long dfs(int dep,int f,int p,int x) { if(dep < 0) return (p%2!=x%2); if(f && vis[dep][f][p][x]) return dp[dep][f][p][x]; if(f) { long long& ret = dp[dep][f][p][x]; vis[dep][f][p][x] = 1; for(int i=0;i<=9;++i) { if(x == -1) { if(i == 0) ret += dfs(dep-1,f,1,-1); else ret += dfs(dep-1,f,1,i%2); } else { if(i%2 == x) { ret += dfs(dep-1,f,p+1,i%2); }else { if(p%2 == x) continue; ret += dfs(dep-1,f,1,i%2); } } } return ret; } else { LL ret = 0; for(int i=0;i<=d[dep];++i) { if(x == -1) { if(i == 0) ret += dfs(dep-1,i<d[dep],1,-1); else ret += dfs(dep-1,i<d[dep],1,i%2); } else { if(i%2 == x) { ret += dfs(dep-1,i<d[dep],p+1,i%2); }else { if(p%2 == x) continue; ret += dfs(dep-1,i<d[dep],1,i%2); } } } return ret; } } long long solve(long long x) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); int len = 0; while(x){ d[len++] = x%10; x/=10; } return dfs(len-1,0,0,-1); } int main() { int T,cas = 1; scanf("%d",&T); while(T--) { scanf("%I64d%I64d",&L,&R); printf("Case #%d: %I64d\n",cas++,solve(R) - solve(L-1)); } return 0; }
相关文章推荐
- 在 SQL Server 中创建数据库和地理数据库
- 页面静态化
- linux上安装redis
- 【JZOJ 4783】 Osu
- 非python路径下,import caffe出错
- 用java语言编写一个“模拟借书系统”
- 滴滴的一些测试题
- [JZOJ4787] 数格子
- 2016.9.17测试解题报告
- Java Integer(-128~127)值的==和equals比较产生的思考
- HDU 5900 QSC and Master 区间DP
- 学习笔记--mysql的AB复制
- 数组排序法(一)
- Butterknife 8.4.0的一些问题
- mysql 索引区别
- centos 7 下配置免密码登录
- AE学习笔记之地图符号化
- per.ccz与png互转
- 项目难点
- Maven学习-继承