HDU 5898 odd-even number
题目:odd-even number
链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898
题意:给一个条件,问l 到r 之间有多少满足条件的数,条件是:连续的奇数长度为偶数,连续的偶数长度为奇数,比如124683,连续的奇数(1、3)长度都是1(奇数),连续的偶数(2468)长度为4(偶数),所以不满足条件。
思路:
很明显的数位dp,可以用dfs做,传下三个参数(pre、p1、p2、ceng),pre表示前一位的数是奇数还是偶数,p1表示前面连续的奇数个数,p2表示前面连续的偶数的个数(p1、p2至少有一个为0),ceng表示还需dfs几位。如果ceng是0,那就判断,pre是偶数p2为奇数、pre是奇数p1是偶数返回1,否则返回0。如果ceng不为0,则分情况递归,比如pre为1且p1为奇数,则这一位不能选择偶数......
然后就是根据具体的数调用dfs求数量。
注意:区间超过longlong,要用字符串存。
AC代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
#define N 20020
#define M 100010
#define Mod 1000000007
#define LL long long
#define INF 0x7fffffff
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define For(i,f_start,f_end) for(int i=f_start;i<f_end;i++)
#define REP(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)
#define Rep(i,f_end,f_start) for(int i=f_end;i>f_start;i--)
#define MT(x,i) memset(x,i,sizeof(x))
#define gcd(x,y) __gcd(x,y)
const double PI = acos(-); LL dfs(int pre,int p1,int p2,int ceng)
{
if(ceng == )
{
if(p1== && p2==) return ;
else if(pre== && p2%==) return ;
else if(pre==) return ;
else if(pre== && p1%==) return ;
else return ;
}
LL ret;
if(p1== && p2==){
ret = dfs(,,,ceng-);
ret += dfs(,,p2+,ceng-)*;
ret += dfs(,p1+,,ceng-)*; }
else if(pre== && p2%==){
ret=dfs(,,p2+,ceng-);
ret = ret * ;
}
else if(pre== && p2%==){
ret=dfs(,,p2+,ceng-)*;
ret+=dfs(,p1+,,ceng-)*;
}
else if(pre== && p1%==){
ret=dfs(,p1+,,ceng-)*;
}
else if(pre== && p1%==){
ret=dfs(,p1+,,ceng-)*;
ret+=dfs(,,p2+,ceng-)*;
}
return ret;
} bool ok(char *x)
{
if(x[]=='' && x[]==) return true;
int pre = , p1 = , p2 = ;
int len=strlen(x)-;
while(len>=)
{
int tmp = (x[len]-'')%;
if(p1== && p2==);
else if(tmp == && pre== && p1%==) return false;
else if(tmp == && pre== && p2%==) return false;
if(tmp == ) p2++,p1=;
else p1++,p2=;
pre=tmp;
len--;
}
if(pre== && p2%==) return false;
if(pre== && p1%==) return false;
return true;
} bool ok(int x)
{
if(x==) return true;
int pre = , p1 = , p2 = ;
while(x)
{
int tmp = x%%;
if(p1== && p2==);
else if(tmp == && pre== && p1%==) return false;
else if(tmp == && pre== && p2%==) return false;
if(tmp == ) p2++,p1=;
else p1++,p2=;
pre=tmp;
x/=;
}
if(pre== && p2%==) return false;
if(pre== && p1%==) return false;
return true;
} LL solve(char *x)
{
LL ret = ;
if(ok(x)){
ret++;
}
int bt[],bo=;
while(x[bo])
{
bt[bo]=x[bo]-'';
bo++;
}
int tmp = ;
while(tmp<=(bo-)/){
int tt = bt[tmp];
bt[tmp]=bt[bo-tmp-];
bt[bo-tmp-]=tt;
tmp++;
}
int pre = , p1 = , p2 = ;
for(int i=bo-;i>=;i--)
{
if(bt[i]>)
{
if(p1 == && p2==)
ret += dfs(pre,,,i);
else
{
if(pre == && p1 % == );
else ret += dfs(,,p2+,i);
}
}
for(int j=;j<bt[i];j++)
{
if(j%==){
if((p1!= || p2!=) && pre == && p2 % == ) continue;
else ret += dfs(,p1+,,i);
}
else
{
if(pre == && p1 % == ) continue;
ret += dfs(,,p2+,i);
}
}
if(p1== && p2==);
else if(bt[i]%== && pre== && p1%==) break;
else if(bt[i]%== && pre== && p2%==) break;
pre = bt[i]%;
if(pre==) p2++,p1=;
else p1++,p2=;
}
return ret;
} int main()
{
int t;
char l[],r[];
int cas=;
scanf("%d",&t);
while(t--){
scanf("%s%s",l,r);
printf("Case #%d: ",cas++);
printf("%I64d\n",solve(r)-solve(l)+(ok(l)?:));
}
return ;
}
HDU 5898 odd-even number的更多相关文章
- HDU 5898:odd-even number(数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 6216 A Cubic number and A Cubic Number【数学题】
hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5
JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...
- hdu 5898 odd-even number(数位dp)
Problem Description For a number,if the length of continuous odd digits is even and the length of co ...
- HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)
定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数. odd和even肯定至少有一个为0 ...
- HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛
题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...
随机推荐
- 【Teradata 】TD最大列数
1.一个表最大列数限制是多少? DB2,表最大列数1012,视图最大列数5000:一行最大长度32677Byte Teradata 表最大列数和视图最大列数2048,:16版本前,一行最大长度为64k ...
- 【汤鸿鑫 3D太极】5年目标规划(基本功、套路、实战搏击)
[5年目标]在基本功的基础上,每年完成一个套路或实战搏击的学习研究. [中小学2年]三段九节 + 2套路. [高中的3年]太极十三势 + 1套路 + 推手 + 搏击. 1.中小学阶段-可自学 (1)基 ...
- 在asp.net web api中利用过滤器设置输出缓存
介绍 本文将介绍如何在asp.net web api中利用过滤器属性实现缓存. 实现过程 1,首先在web.config文件下appsettings下定义“CacheEnabled”和“CacheTi ...
- 【js】统计数组中某些项的个数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ActiveMQ的作用总结(应用场景及优势)
业务场景说明: 消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速度. 在不使用消息队列的情况下,用户的请求数据直接写入数据 ...
- Spark笔记-gz压缩存储到HDFS【转】
参考:http://blog.csdn.net/u010454030/article/details/69291663 mergedRDD.saveAsTextFile(outputPath, cla ...
- devops工具-Ansible进阶playbook&roles
一.playbook介绍 playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- FineUIMvc随笔(2)怎样在控件中嵌套 HTML
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户需求 有网友在<FineUI总群1>问这么一个问题:怎么把 HTML 嵌套在控件中? 这是很多刚学习 FineU ...
- C# socket实践 - 简易版FTP(Server & Client)
写了个简易版的ftp(服务器和客户端),运行效果如下图: click download下载中的UI: 原理:模仿正规ftp方式,分成2个socket连接:文本命令socket.数据信道socket. ...