定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数。

  odd和even肯定至少有一个为0,而且最后的判断只和odd与even的奇偶性有关,能看出这个状态是可以被缩小到很小的,但是DP菜鸟我为了避免出错,还是定义了8万的可以接受的数组。

  代码及注释如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
LL dp[][][][];
int bit[];
LL dfs(int pos,int pre,bool limit,bool lead0,int odd,int even)
{
if(pos == -)
{
if(odd== && even%==) return ;
if(even== && odd%==) return ;
return ;
}
if(!limit && !lead0 && dp[pos][pre][odd][even]!=-)///为了
///保证没有任何的歧义,前两个判定条件是必要的
{
return dp[pos][pre][odd][even];
}
int up = limit? bit[pos]: ;
LL ans = ;
for(int i = ; i <= up; i++)
{
bool Nlimit = (limit && i==up);
bool Nlead0 = (lead0 && i==);
if(lead0)///前导0存在的时候,建议特殊判断
{
if(i==) ans += dfs(pos-,i,Nlimit,Nlead0,,);
else if(i%==) ans += dfs(pos-,i,Nlimit,Nlead0,,);
else ans += dfs(pos-,i,Nlimit,Nlead0,,);
}
else
{
if( (odd%==&&i%==) || (even!=&&even%==&&i%==) ) continue;
///这两种状态是不符合要求的状态,第二个判断需要注意even = 0的情况
if(i%==) ans += dfs(pos-,i,Nlimit,Nlead0,,even+);
else ans += dfs(pos-,i,Nlimit,Nlead0,odd+,);
}
}
if(!limit && !lead0) dp[pos][pre][odd][even] = ans;
return ans;
}
LL solve(LL x)
{
int pos = ;
while(x)
{
bit[pos++] = x%;
x /= ;
}
return dfs(pos-,-,true,true,,);
}
int main()
{
// freopen("1.in.cpp","r",stdin);
int t,ca=;
LL l,r;
cin>>t;
memset(dp,-,sizeof(dp));
while(t--)
{
cin>>l>>r;
printf("Case #%d: ",++ca);
cout<<solve(r)-solve(l-)<<endl;
}
return ;
}

HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)的更多相关文章

  1. 2016沈阳网络赛 odd-even number

    odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

    题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fa ...

  3. 2016 ccpc 网络选拔赛 F. Robots

    Robots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. HDU 5898:odd-even number(数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...

  5. HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...

  6. HDU 6197 array array array 2017沈阳网络赛 LIS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197 题意:给你n个数,问让你从中删掉k个数后(k<=n),是否能使剩下的序列为非递减或者非递增 ...

  7. HDU 6194 string string string 2017沈阳网络赛 后缀数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意:告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次. 解法:后缀数组 ...

  8. HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)

    题目链接  2016 Qingdao Online Problem I 题意  在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...

  9. 2016沈阳网络赛 QSC and Master

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

随机推荐

  1. [其他]Jboss容器开启调试模式

    1.登陆服务器: 2.找到$JBOSS_HOME/bin/run.conf 3.找到# Sample JPDA settings for remote socket debuging这项,并将说明下方 ...

  2. anglarjs概述

    anglarjs 是一个MVC框架,是开发单页面应用的上上之选,它不是一个功能库,是一个开发动态页面的html框架.专注于扩展html功能,提供动态数据绑定,并能够与jquery合作融洽. 要定义一个 ...

  3. one-sided limit

    Limit[e^(-1/x),x->0,Direction->-1] means $\lim_{x \to 0^{+}}e^{-\frac{1}{x}}$ Limit[e^(-1/x),x ...

  4. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

  5. PHP中 post 与get的区别 详细说明

    1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.jincaib.c ...

  6. POJ 3740 Easy Finding

    #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using ...

  7. 投票项目-bootstrap

    <script id="src" type="text/tmpl"> //script标签的type写成这个,浏览器会认为他不是javascript ...

  8. c# 使用 HttpWebRequest模拟登陆

    c# 使用 HttpWebRequest模拟登陆(附带验证码) 分类: C# .net2010-06-04 00:50 35647人阅读 评论(43) 收藏 举报 c#exceptionstreams ...

  9. ECMAScript6标准新增加的内容

    首选呐,你得了解一下javascript和ECMAScript的关系: 编程语言JavaScript是ECMAScript的实现和扩展,由ECMA(一个类似W3C的标准组织)参与进行标准化.ECMAS ...

  10. Java中ArrayList的使用

    //创建ArrayList ArrayList arr  = new ArrayList(); //ArrayList添加数据 arr.add("123"); arr.add(&q ...