HDU5898、 HDU 2089(数位DP)
题目链接: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)的更多相关文章
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- HDU 2089 数位dp入门
开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...
- HDU 2089 数位dp/字符串处理 两种方法
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2089 数位dp
链接:https://vjudge.net/problem/23625/origin 中文,题目不用说了. 其实这题的数据很小,所以直接暴力也可以过,但是还是要学会数位dp,因为并不是每一题的数据都会 ...
- 不要62(HDU 2089数位dp入门)
题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 分析:dp[i][f]数字表示不含 4 和 62的前提下,剩余长度为 len ,首位是否为 6 的个数. #include < ...
- HDU - 2089 数位DP 初步
中文题目,不要62和4 从高位往低位DP,注意有界标志limit的传递 dp2记忆有界情况下的计数结果,据说用处不大 我所参考的入门文章就是半搜索(有界)半记忆(无界)的 进阶指南中提出dfs维度有多 ...
- 杭电hdu 2089 数位dp
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍 ...
- hdu 2089 数位dp入门题
#include<stdio.h> //dp[i][0]代表不存在不吉利数字 //dp[i][1]代表不存在不吉利数字但是以2开头 //dp[i][2]代表存在不吉利数字 #define ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- lievent源码分析:evbuffer
struct evbuffer定义在evbuffer-internal.h文件中. evbuffer结构内部保存一个以evbuffer-chain结构为节点的链表,evbuffer内部有两个分别指向首 ...
- centos6.6编译安装lnmp系列之mysql
简介: 环境:虚拟机+centos6.6 Mysql版本:5.6.21 Mysql下载地址:http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.21.t ...
- iphone 3gs 美版,6.1.3+降基带+越狱+解锁。成功分享(转)
本人参照这个帖子成功把一个白苹果的机器救活了 2014年1月26日 13点 转自:http://bbs.app111.com/thread-510632-1-1.html 时间:2013年5月31日 ...
- <转>修改TM2013聊天记录保存目录final版
一直很钟意TM的清爽,然而在升级到TM2013 preview1后,发生了一件很让人头痛的事. 那就是无法设定消息目录,TM会默认为保存在我的文档下.这让使用dropbox同步聊天记录的我感到十 ...
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
- 一步一步学习underscore的封装和扩展方式
前言 underscore虽然有点过时,这些年要慢慢被Lodash给淘汰或合并. 但通过看它的源码,还是能学到一个库的封装和扩展方式. 第一步,不污染全局环境. ES5中的JS作用域是函数作用域. 函 ...
- Extjs关于alert显示不出—异步问题
对应extjs提示框不能正常显示,而使用js的本身提示框可以正常,但由于样式不统一,不是 好的解决方法. 解决该问题,要了解extjs异步原理. ext的提示框都是异步的,非阻塞模式的,浏览器js的提 ...
- idea 工程添加svn关联
1.想启用idea的SVN插件还需要在idea配置一下(Ctrl + Alt + S),如下图所示: 2.接下来启用idea的版本控制插件(这里当然是启用Subversion了),打开“VCS”菜单项 ...
- IOS开发之WIFI及IP相关
获取手机设备的IP信息: #import <ifaddrs.h> #import <arpa/inet.h> // Get IP Address - (NSString *)g ...
- centos 安装redis自启动要点
1.redis.conf a.daemonize yes b.pidfile /var/run/xxx.pid 2./etc/init.d/redis //加了下面三个注释部分,才支持设置开机自启动 ...