hdu2089数位dp
2015-09-01 09:43
441 查看
[L,R]中数字不含有4或62的个数。
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.NavigableSet; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import java.util.Set; import java.util.SortedSet; import java.util.Stack; import java.util.StringTokenizer; import java.util.TreeSet; public class Main { public static void main(String[] args) throws IOException{ StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)); InputReader in = new InputReader(System.in) ; PrintWriter out = new PrintWriter(System.out) ; while(true){ int l = in.nextInt() ; int r = in.nextInt() ; if(l==0 && r==0) break ; new Task().solve(l, r , out) ; } out.flush() ; } } class Task{ static int dp[][] = new int[10][10] ; static{ for(int i = 0 ; i < 10 ; i++) Arrays.fill(dp[i], -1); } static int[] bit = new int[10] ; static int len ; int dfs(int pos , int pre , boolean end){ if(pos == -1) return 1 ; if(!end && dp[pos][pre] != -1) return dp[pos][pre] ; int d = end ? bit[pos] : 9 ; int sum = 0 ; for(int i = 0 ; i <= d ; i++){ if(i == 4) continue ; if(pre == 6 && i == 2) continue ; sum += dfs(pos-1 , i , end && i == d) ; } if(!end) dp[pos][pre] = sum ; return sum ; } int answer(int n){ len = 0 ; while(n > 0){ bit[len++] = n % 10 ; n /= 10 ; } return dfs(len-1 , 0 , true) ; } public void solve(int l , int r , PrintWriter out) throws IOException{ out.println(answer(r) - answer(l-1)) ; } } class InputReader{ public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream){ reader = new BufferedReader(new InputStreamReader(stream), 32768) ; tokenizer = null ; } public String next(){ while(tokenizer == null || ! tokenizer.hasMoreTokens()){ try{ tokenizer = new StringTokenizer(reader.readLine()); }catch (IOException e){ throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt(){ return Integer.parseInt(next()); } public long nextLong(){ return Long.parseLong(next()); } public double nextDouble(){ return Double.parseDouble(next()); } }
相关文章推荐
- C# Chart 控件快速使用
- Nginx反向代理和负载均衡部署指南
- HTTP/TCP/UDP协议详解
- ORB特征点检测
- 九度oj 1193
- Redis BRPOP key [key ...] timeout
- 确认网络环境
- linux 文件管理以及其相关指令
- 二叉树的建立与遍历
- 枚举
- linux 根据进程名查看其占用的端口
- linux C程序中获取shell脚本输出(如获取system命令输出)
- 利用反射机制实现简单数据查询
- BRIEF 特征描述子
- SURF算法与源码分析、下
- RAP开发入门-布局管理
- QQ对话代码
- Spring笔记――1.Spring简介
- cocos2d-x 内存管理(3)
- SURF算法与源码分析、上