多校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 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小
// 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位
// http://blog.csdn.net/weizhuwyzc000/article/details/52097690 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
const double inf = 0x3f3f3f3f;
#define lson l,mid,rt<<1
// #define rson mid+1,r,rt<<1|1
const int N = ;
const int M = 1e6+;
const int MOD = 1e9+;
#define LL long long
#define LB long double
// #define mi() (l+r)>>1
double const pi = acos(-);
const double eps = 1e-;
void fre(){freopen("in.txt","r",stdin);}
void freout(){freopen("out.txt","w",stdout);}
inline int read(){int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') { x=x*+ch-'';ch=getchar();}return x*f;} LL l,r,cnt;
int k;
int dig[];
LL dp[][][][][][];
int vis[][][][][][];
int cas;
LL dfs(LL pos,int a,int b,int c,int d,int f){
if(pos==cnt) return 1LL;
if(vis[pos][a][b][c][d][f]==cas) return dp[pos][a][b][c][d][f];
vis[pos][a][b][c][d][f]=cas;
LL ans=;
if(f){
for(int i=;i<;i++){
if(k==) {if(d==i) continue;}
else if(k==) {if(d==i||c==i) continue;}
else if(k==) {if(d==i||c==i||b==i) continue;}
else {if(d==i||c==i||b==i||a==i) continue;}
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,f);
else ans+=dfs(pos+,b,c,d,i,f);
}
else ans+=dfs(pos+,b,c,d,i,f);
}
}
else{
for(int i=;i<;i++){
if(k==) {if(d==i) continue;}
else if(k==) {if(d==i||c==i) continue;}
else if(k==) {if(d==i||c==i||b==i) continue;}
else {if(d==i||c==i||b==i||a==i) continue;}
if(i<dig[pos]){
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,);
else ans+=dfs(pos+,b,c,d,i,);
}
else ans+=dfs(pos+,b,c,d,i,);
}
else if(i==dig[pos]){
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,f);
else ans+=dfs(pos+,b,c,d,i,f);
}
else
ans+=dfs(pos+,b,c,d,i,f);
}
}
}
return dp[pos][a][b][c][d][f]=ans;
} bool ck(){
for(int i=;i<cnt;i++){
for(int j=i-;j>=max(,i-k+);j--){
if(dig[i]==dig[j]) return false;
}
}
return true;
}
int tem[];
int main(){
while(~scanf("%I64d%I64d%d",&l,&r,&k)){
cnt=;
while(r) tem[cnt++]=r%,r=r/;
int k=;
for(int i=cnt-;i>=;i--) dig[k++]=tem[i];
cas++;
LL ans1=dfs(,,,,,);
cnt=,k=;
while(l) tem[cnt++]=l%,l=l/; for(int i=cnt-;i>=;i--) dig[k++]=tem[i];
cas++;
LL ans2=dfs(,,,,,);
if(ck()) ans2--;
printf("%I64d\n",ans1-ans2);
}
return ;
}
多校5 HDU5787 K-wolf Number 数位DP的更多相关文章
- HDU5787 K-wolf Number 数位dp
分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...
- codeforces Hill Number 数位dp
http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits: 5000 MS Memory Limits: ...
- 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 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- beautiful number 数位DP codeforces 55D
题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- Fzu2109 Mountain Number 数位dp
Accept: 189 Submit: 461Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description One ...
- hdu_3565_Bi-peak Number(数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3565 题意:给你一个区间,让你找这个区间内有两个山峰的数的最大和,什么是两个山峰,比如121121 ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
随机推荐
- UNIX 高手的 20 个习惯[转]
使用 mkdir 的 -p 选项并在单个命令中创建所有父目录及其子目录要容易得多.但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录.花时间有意识地养成这个好习惯 ...
- C#基础(三)
运算符 分类 符号 解释 优先级 算数 ++,—— 加加,减减 由高到低,即执行顺序由上到下(圆括号优先级最高) * /% 乘 除 取余 + - 加 减 关系 关系和逻辑运算符永远是布尔型 > ...
- VB 语言学习笔记.
暂时用到,学习学习. 变量声明 Dim 变量名 as 数据类型类型 Set 实例 = new 类名 自定义数据类型 Type 数据类型标识符 域名 As 数据类型; 域名 As 数据类型; 域名 As ...
- JVM学习笔记(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...
- BZOJ 2299 向量
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2299 题意:给出一对数a,b,任意使用(a,b), (a,-b), (-a,b), (- ...
- Linux/Centos下清理内存和Cache方法
Linux/Centos下释放内存和缓存方法 $ free -m 运行sync将dirty的内容写回硬盘$ sync 通过修改proc系统的drop_caches清理free的cache$ echo ...
- [HDOJ2795]Billboard(线段树,单点更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:w*h的公告板要贴公告,公告是w*1的,每个公告有先后顺序,要使每个公告贴的位置尽可能地高 ...
- How can I add a new user as sudoer using the command line?
Two ways to use sudo command for a standard user account: First, If you want to use sudo command for ...
- bzoj3252
简单题,每次取出最长链,然后对于练上每个点x,终点在其子树内的链都要减去a[x] 这显然可以用dfs序+线段树维护 显然每个点只要删一次即可,复杂度是O(nlogn) type node=record ...
- bzoj2797
对和排序,显然最小是a1+a2,次小a1+a3 然后穷举哪里是a2+a3 这样a1,a2,a3就求出来了 注意a2+a3只可能是前n+1项中的一个,所以穷举这步是O(n)的 接下来我们把已经确定的数的 ...