题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5898

题意:很明确,找出区间[l , r]中符合连续奇数为偶数,连续偶数为奇数的个数。

思路:dp[i][j][1]表示i位数j开头符合条件的数,dp[i][j][0]表示i位数j开头(之后)可能符合条件的数。

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[22][11][2];
void init()
{
memset(dp,0,sizeof(dp));
for(int i = 0; i <= 9; i++)
{
if(i & 1)
dp[1][i][0] = 1;
else
dp[1][i][1] = 1;
}
for(int i = 2; i <= 19; i++)
{
for(int j = 0; j <= 9; j++)
{
for(int k = 0; k <= 9; k++)
{
if((j & 1) == (k & 1))
{
dp[i][j][1] += dp[i-1][k][0];
dp[i][j][0] += dp[i-1][k][1];
}
else if(j & 1)
dp[i][j][0] += dp[i-1][k][1];
else
dp[i][j][1] += dp[i-1][k][1];
}
}
}
}
ll solve(ll x)
{
int len = 0, a[22], num;//num表示当前连续奇数或偶数的个数
ll ans = 0;
while(x)
{
a[++len] = x % 10;
x /= 10;
}
a[len+1] = 0;
for(int i = len; i >= 1; i--)
{
for(int j = 0; j < a[i]; j++)
{
if(i == len && j)//之后再处理前导0
ans += dp[i][j][1];
else if(i < len)
{
if(j & 1)
{
if((a[i+1] & 1) && (num & 1))
ans += dp[i][j][0];
else if((a[i+1] & 1) && !(num & 1))
ans += dp[i][j][1];
else if(!(a[i+1] & 1) && (num & 1))
ans += dp[i][j][1];
}
else
{
if((a[i+1] & 1) && !(num & 1))
ans += dp[i][j][1];
else if(!(a[i+1] & 1) && (num & 1))
ans += dp[i][j][0];
else if(!(a[i+1] & 1) && !(num & 1))
ans += dp[i][j][1];
}
}
}
if(i == len)
{
num = 1;
continue;
}
if((a[i+1] & 1) != (a[i] & 1))//
{
if((num & 1) == (a[i+1] & 1))//出现不符合题意的情况,没必要再继续判断下去
break;
num = 1;
}
else
num++;
}
for(int i = len - 1; i >= 1; i--)//处理前导0的情况
{
for(int j = 1; j <= 9; j++)
ans += dp[i][j][1];
}
return ans;
}
int main()
{
int T, cas = 1;
scanf("%d",&T);
init();
while(T--)
{
ll l,r;
scanf("%lld %lld",&l,&r);
printf("Case #%d: %lld\n", cas++, solve(r+1) - solve(l));
}
return 0;
} 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 思路:dp[i][j]表示i位数j开头符合条件的数,由于前导0不受条件影响,不需要单独考虑。 如判断数字1462,第一次处理0000-0999,第二次处理1000-1399,由于出现4显然不符合条件,后面也不需要继续判断了,直接退出循环。 #include<cstdio>
#include<cstring>
using namespace std;
int dp[10][11];
void init()
{
memset(dp,0,sizeof(dp));
for(int i = 0; i <= 9; i++)
{
if(i != 4)
dp[1][i] = 1;
}
for(int i = 2; i <= 7; i++)
{
for(int j = 0; j <= 9; j++)
{
for(int k = 0; k <= 9; k++)
{
if(j == 4 || j == 6 && k == 2)
continue;
dp[i][j] += dp[i-1][k];
}
}
}
}
int solve(int x)
{
int len = 0, a[10], num;
int ans = 0;
while(x)
{
a[++len] = x % 10;
x /= 10;
}
a[len+1] = 0;
for(int i = len; i >= 1; i--)
{
for(int j = 0; j < a[i]; j++)
{
if(j == 4 || j == 2 && a[i+1] == 6)
continue;
ans += dp[i][j];
}
if(a[i] == 4 || a[i+1] == 6 && a[i] == 2)
break;
}
return ans;
}
int main()
{
init();
int l,r;
while(scanf("%d %d",&l,&r) && (l || r))
printf("%d\n", solve(r+1) - solve(l));
return 0;
}

HDU5898、 HDU 2089(数位DP)的更多相关文章

  1. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

  2. HDU 2089 数位dp入门

    开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...

  3. HDU 2089 数位dp/字符串处理 两种方法

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. hdu 2089 数位dp

    链接:https://vjudge.net/problem/23625/origin 中文,题目不用说了. 其实这题的数据很小,所以直接暴力也可以过,但是还是要学会数位dp,因为并不是每一题的数据都会 ...

  5. 不要62(HDU 2089数位dp入门)

    题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 分析:dp[i][f]数字表示不含 4 和 62的前提下,剩余长度为 len ,首位是否为 6 的个数. #include < ...

  6. HDU - 2089 数位DP 初步

    中文题目,不要62和4 从高位往低位DP,注意有界标志limit的传递 dp2记忆有界情况下的计数结果,据说用处不大 我所参考的入门文章就是半搜索(有界)半记忆(无界)的 进阶指南中提出dfs维度有多 ...

  7. 杭电hdu 2089 数位dp

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍 ...

  8. hdu 2089 数位dp入门题

    #include<stdio.h> //dp[i][0]代表不存在不吉利数字 //dp[i][1]代表不存在不吉利数字但是以2开头 //dp[i][2]代表存在不吉利数字 #define ...

  9. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  10. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. mac攻略(二) -- 简单配置php开发环境

    最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP.   1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...

  2. java关于时间

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created b ...

  3. win7 用户目录

    robocopy "C:\Users" "D:\Users" /E /COPYALL /XJ /XD "C:\Users\Administrator& ...

  4. 关于autoptr

    参考自: http://www.cppblog.com/expter/archive/2009/03/29/78270.html auto_ptr是什么. 解释1.auto_ptr是一个管理指针的对象 ...

  5. 安装openJDK 8

    1.JDK 8 示例 (1.1)Debian, Ubuntu等使用下述安装命令: $ -jre ps : openjdk-8-jre 仅包含JRE,如果需要开发java程序,需要下载openjdk-8 ...

  6. 学的一点点ps

    从C语言的代码中解脱开始学ps,看到色彩鲜明的东西,心里只有那么爽.哈哈.只学习3天,虽然只是一些皮毛,可还是学到了一些以前不知道的东西.让我对ps多了很多兴趣,决定以后要自学更多的ps技能.要给图片 ...

  7. (六)ICMP、ping

    ping命令是ICMP协议 127.0.0.1 ifconfig -all

  8. [转]我为什么要学习python

    我为什么要学习python   引言:学习python近两年,谈谈我对于python的一点小理解,也从一些方面谈谈自己微薄的想法,也就是我为什么学习python 这里我不讨论python的一些有用的库 ...

  9. Linux 下安装pip

    安装pip 使用脚本安装和升级pip 要安装或升级pip,需要下载 get-pip.py. 地址:https://bootstrap.pypa.io/get-pip.py 然后运行以下命令 (需要管理 ...

  10. python编程技巧2

    模块化 ---- 这是我们程序员梦寐以求的,通过模块化可以避免重复的制造轮子. 同时 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块 ...