题目链接: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. VC++6.0在Win7以上系统上Open或Add to Project files崩溃问题 解决新办法

    崩溃原因是和office高版本冲突,比如我64位win7装了64位office2013及visio就遇到了这个问题(我很纳闷,记得重装系统前装的是32位office2013及visio就未曾遇到该问题 ...

  2. file以及文件大小转化问题

    android 获取文件夹.文件的大小 以B.KB.MB.GB 为单位             public class FileSizeUtil { public static final int ...

  3. SQL 向上取整、向下取整、四舍五入取整的实例!round、rounddown、roundup

    sql server ==================================================== [四舍五入取整截取] select round(54.56,0) === ...

  4. 【转载】C++ 与“类”有关的注意事项总结(十二):按成员初始化 与 按成员赋值

    原文:C++ 与"类"有关的注意事项总结(十二):按成员初始化 与 按成员赋值 一.按成员初始化(与构造函数和拷贝构造函数有关) 用一个类对象初始化另一个类对象,比如: Accou ...

  5. 初识DeepLearning4j

    标签(空格分隔): DeepLearning 在Mac上装DP4j 1. 安装Java 因为DP4j是基于JVM的,所以要先安装一下Java. 使用命令行brew install java 并且在pr ...

  6. 设置core环境

    void dummy_function (void){ unsigned char *ptr = 0x00; *ptr = 0x00;} int main (void){ dummy_function ...

  7. Consul Template的简单使用

    Consul Template的使用 1安装 地址 https://github.com/hashicorp/consul-template/releases wget https://release ...

  8. UiAutomator环境搭建及详细操作

    一.环境搭建 1.1 必备条件 JDK SDK(API高于15) Eclipse(安装ADT插件) ANT(用于编译生成的jar) 安装JDK并添加环境变量 1.2 详细步骤 1.安装JDK并添加环境 ...

  9. MFC编程入门之十二(对话框:非模态对话框的创建及显示)

    上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...

  10. Head First 设计模式 --5 单例模式

    单例模式:确保一个类只有一个实例,并提供一个全局访问点.用到的设计原则:1.封装变化2.组合优于集成3.针对接口变成而不是针对实现4.为交互对象之间的松耦合设计而努力5.类应该对扩展开放,对修改关闭6 ...