HDU 5787 K-wolf Number(数位DP)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5787
【题目大意】
求区间【L,R】内十进制数相邻k位之间不相同的数字的个数。
【题解】
很显然的数位dp,但是状态不知道该怎么转移,然后发现了递归数位DP这种神奇的姿势,每次记录前k位的数字,然后枚举下一位能用的数字,递归即可。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=25,M=10005;
int bit[N],pw[5],k;
ll dp[N][M][2][2],l,r;
ll DP(int d,int x,bool f,bool lim){
int c[5];
if(d==-1)return 1;
ll &ret=dp[d][x][f][lim];
if(~ret)return ret; ret=0;
int st=k-1,y=x,pos=0;
for(int i=0;i<k;i++)c[i]=y%10,y/=10;
if(!f){while(!c[st]&&st>=0)st--;}
for(int i=st;i>=0;i--)pos|=1<<c[i];
int up=lim?bit[d]:9;
for(int i=0;i<=up;i++){
if(pos>>i&1)continue;
if(f)ret+=DP(d-1,(x-pw[k-1]*c[k-1])*10+i,f,lim&&i==up);
else if(st==-1&&!i)ret+=DP(d-1,0,0,lim&&i==up);
else ret+=DP(d-1,x*10+i,st==k-2,lim&&i==up);
}return ret;
}
ll Cal(ll x){
if(!x)return 1;int cnt=0;
while(x)bit[cnt++]=x%10,x/=10;
memset(dp,-1,sizeof(dp));
return DP(cnt-1,0,0,1);
}
int main(){
for(int i=pw[0]=1;i<5;i++)pw[i]=pw[i-1]*10;
while(~scanf("%lld%lld%d",&l,&r,&k)){
k--;printf("%lld\n",Cal(r)-Cal(l-1));
}return 0;
}
HDU 5787 K-wolf Number(数位DP)的更多相关文章
- 多校5 HDU5787 K-wolf Number 数位DP
// 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- HDU 5787 K-wolf Number 数位DP
K-wolf Number Problem Description Alice thinks an integer x is a K-wolf number, if every K adjacen ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
- 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 (数位DP) -2016 ICPC沈阳赛区网络赛
题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 4352 - XHXJ's LIS - [数位DP][LIS问题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- jQuery简单前端表单验证
<!DOCTYPE html> <html> <head> <title>表单验证</title> <script src=" ...
- Android:res之selector背景选择器
selector根据不同的选定状态来定义不同的现实效果 常用属性: android:state_selected--------选中android:state_focused--------获得焦点a ...
- web中webAppRootKey作用
<context-param> <param-name>webAppRootKey</param-name> <param-value>bgn.root ...
- 发送邮件java实现
下面代码可以实现普通qq邮箱发送邮件的功能,可以传附件,但是是固定的附件: 需要两个jar包:mail.jar,activation.jar mail.jar 下载地址: http://java.su ...
- thunk的主要用法
主要用法目前用的多的就三种; thunk.all 并发 thunk.sql 同步 thunk.race 最先返回的进入结果输出 前两个返回的结果都是数组,最后一个返回的是对象: thunk的链式调用没 ...
- LeetCode总结 -- 高精度篇
我们常见的一些主要的数据结构比方整型int或者浮点型float由于位数过多无法用内置类型存储,这时候我们就须要自己实现高精度的数据类型来进行存储和运算.这样的问题在实际产品中还是比較有用的,所以相对来 ...
- Maven真——聚合和继承(于)
依赖管理 我们谈论继承一个dependencies因素,我们非常easy这个特性被认为是适用于accout-parent于. 子模块account-email和account-persist同一时候依 ...
- oracle 快照(snapshot) 管理
----手工创建oracle 快照 BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); END; / ---删除快照 详细快照信息能够查看视图 ...
- oracle11g ora-12514监听程序当前无法识别
环境:win7_x64 ,oracle11g 描写叙述:1第一天没问题,第二天就不能连接: 2:pl sql developer连接工具,自己安装的oracle数据库,又装了client 3:装了or ...
- oracle数据库获取指定表的列的相关信息
1.很多时候我们需要从数据库中获取指定表的所有列的相关属性,如 name,commens,datatype,datalength,pk等.下面就是制定的语句. select c.TABLE_NAME ...