题目链接: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. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  2. HDU Coprime

    Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  3. sqlserver 纵横

    纵表转横表 create table Score ( Name ), Class ), score int ) ) ) ) ) ) ) ) select * from Score select t.N ...

  4. bootstrap中table页面做省市区级联效果(级联库见前面级联编辑)(非select下拉框)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 程序源系统与当前系统不一致:Carry out repairs in non-original systems only if urgent

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. Python学习笔记(2)

    变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,它会存储在存储中,称之为变量(Variable),在大多数语言中,都把这种行为称为“给变量赋值”或“把值存储在变量中”. 而Python与 ...

  7. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

  8. hdu 5446 Unknown Treasure 卢卡斯+中国剩余定理

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  9. 深入浅出设计模式——模板方法模式(Template Method Pattern)

    模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...

  10. Flex http请求

    下面类支持POST和GET请求,请求数据和出错将返回 package com.sole.util { import flash.events.Event; import flash.events.HT ...