HDU5898数位DP
来源:互联网 发布:优化食物品质的添加剂 编辑:程序博客网 时间:2024/06/08 07:50
求区间[L,R],满足:
连续奇数个数为偶数 或者
连续偶数个数为奇数
的个数。
注意前缀为0的特殊情况
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new P1007().main();}}class P1007 {final int Max_N = 20;final int ODD = 1;final int EVEN = 0;final BigInteger ten = BigInteger.valueOf(10);long[][][] dp = new long[Max_N][2][Max_N];int[] bit = new int[Max_N];boolean isEven(int x) {return (x & 1) == 0;}boolean isOdd(int x) {return (x & 1) == 1;}long DP(int pos, int pre, int bitSum, boolean isend) {if (pos == -1) {if (pre == EVEN)return isOdd(bitSum) ? 1L : 0L;elsereturn isEven(bitSum) ? 1L : 0L;}if (pre != -1 && !isend && dp[pos][pre][bitSum] != -1)return dp[pos][pre][bitSum];int d = isend ? bit[pos] : 9;long ans = 0;for (int i = 0; i <= d; i++) {if (pre == -1) {if (i == 0)ans += DP(pos - 1, -1, bitSum, isend && (i == d));else if (isEven(i))ans += DP(pos - 1, EVEN, bitSum + 1, isend && (i == d));elseans += DP(pos - 1, ODD, bitSum + 1, isend && (i == d));} else if (pre == EVEN) {if (isEven(i))ans += DP(pos - 1, EVEN, bitSum + 1, isend && (i == d));else {if (isEven(bitSum)) {ans += 0;} elseans += DP(pos - 1, ODD, 1, isend && (i == d));}} else if (pre == ODD) {if (isOdd(i))ans += DP(pos - 1, ODD, bitSum + 1, isend && (i == d));else {if (isOdd(bitSum)) {ans += 0;} elseans += DP(pos - 1, EVEN, 1, isend && (i == d));}}}if (pre != -1 && !isend)dp[pos][pre][bitSum] = ans;return ans;}long Ans(BigInteger x) {int Len = 0;while (x.compareTo(BigInteger.ZERO) > 0) {bit[Len++] = x.mod(ten).intValue();x = x.divide(ten);}return DP(Len - 1, -1, 0, true);}InputReader in = new InputReader(System.in);PrintWriter out = new PrintWriter(System.out);void main() {for (int i = 0; i < Max_N; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < Max_N; k++) {dp[i][j][k] = -1;}}}BigInteger l, r;int t = in.nextInt();for (int ca = 1; ca <= t; ca++) {out.print("Case #" + ca + ": ");l = in.nextBigInteger();r = in.nextBigInteger();long sr = Ans(r);long sl = Ans(l.subtract(BigInteger.ONE));out.println(sr - sl);}out.flush();}}class InputReader {public BufferedReader reader;public StringTokenizer tokenizer;public InputReader(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = new StringTokenizer("");}private void eat(String s) {tokenizer = new StringTokenizer(s);}public String nextLine() {try {return reader.readLine();} catch (Exception e) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String s = nextLine();if (s == null)return false;eat(s);}return true;}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}
0 0
- 数位dp,hdu5898
- hdu5898(数位dp)
- HDU5898 oddeven 数位DP
- HDU5898数位DP
- HDU5898 数位DP
- hdu5898数位dp
- hdu5898 odd-even number 【数位DP】
- hdu5898 odd-even number(数位dp)
- hdu5898 odd-even number(数位dp)
- HDU5898、 HDU 2089(数位DP)
- hdu5898 odd-even number(数位DP)
- hdu5898 数位dp+预处理 odd-even number
- HDU5898 odd-even number(数位dp)
- hdu5898 odd-even number (数位DP)
- 2016Shenyang网络预选赛1007 / HDU5898 (数位dp)
- HDU5898 odd-even number (数位DP)shenyang网赛
- 数位DP!!!(hdu3555 hdu2089 hdu5898 2016弱校10.5 I)
- 【hdu5898】【数位DP】odd-even number 【连续奇数长度为偶数,连续的偶数的长度是奇数】
- JavaScript常用内置对象(window、document、form对象)
- 第五周项目10求两个数的正差值
- 二值图像查找边界,并对边界进行搜索,剔除小边界
- 前端之旅
- easyui datagrid表格数据为空美化
- HDU5898数位DP
- Android面试经验 -- 乐视
- 如何做SEO项目管理?
- 第五周-项目2-3发工资
- C语言小知识点 汇总4 指针及指针与数组
- 耳切法处理多边形三角划分
- 国庆上班的第一天
- android自动打包签名
- Codeforces Round #368 (Div. 2) E Garlands(二维树状数组+暴力)