题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5787

题意:要求相邻的K个位的数不能相同,在[L,R]区间有多少个这样的数.

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int bit[];
long long dp[][][][][];
int k; //考虑前导零:d = 10代表前一位是0, 当(d == 10 && u == 0)表示当前这位为0并且前4位都是0 bool check(int a, int b, int c, int d, int u)
{
if(k == ) return u != d;
else if(k == ) return u != d && u != c;
else if(k == ) return u != d && u != c && u != b;
else return u != d && u != c && u != b && u != a;
} long long dfs(int pos, int a, int b, int c, int d, bool flag)
{
if(pos <= ) return d != ;
long long res = dp[pos][a][b][c][d];
if(flag && res != -) return res;
long long ans = ;
int up = flag ? : bit[pos];
for(int u = ; u <= up; u++) {
if(d == && u == ) {
ans += dfs(pos - , a, b, c, d, flag || u != up);
} else if(check(a, b, c, d, u)) {
ans += dfs(pos - , b, c, d, u, flag || u != up);
}
}
if(flag) dp[pos][a][b][c][d] = ans;
return ans;
} long long solve(long long x)
{
int len = ;
while(x) {
bit[++len] = x % ;
x /= ;
}
return dfs(len, , , , , );
} int main()
{
long long l, r;
while(~scanf("%I64d%I64d%d", &l, &r, &k)) {
memset(dp, -, sizeof(dp));
printf("%I64d\n", solve(r) - solve(l - ));
}
return ;
}

另一种:

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int bit[];
long long dp[][][][][][];
int k; //考虑前导零:d = 10代表前一位是0, 当(d == 10 && u == 0)表示当前这位为0并且前4位都是0 bool check(int a, int b, int c, int d, int u)
{
if(k == ) return u != d;
else if(k == ) return u != d && u != c;
else if(k == ) return u != d && u != c && u != b;
else return u != d && u != c && u != b && u != a;
} long long dfs(int pos, int a, int b, int c, int d, bool flag, bool zero)
{
if(pos <= ) return zero;
long long res = dp[pos][a][b][c][d][zero];
if(flag && res != - && zero) return res;
long long ans = ;
int up = flag ? : bit[pos];
for(int u = ; u <= up; u++) {
if(!zero && u == ) {
ans += dfs(pos - , a, b, c, d, flag || u != up, );
} else if(check(a, b, c, d, u)) {
ans += dfs(pos - , b, c, d, u, flag || u != up, );
}
}
if(flag) dp[pos][a][b][c][d][zero] = ans;
return ans;
} long long solve(long long x)
{
int len = ;
while(x) {
bit[++len] = x % ;
x /= ;
}
return dfs(len, , , , , , );
} int main()
{
long long l, r;
while(~scanf("%I64d%I64d%d", &l, &r, &k)) {
memset(dp, -, sizeof(dp));
printf("%I64d\n", solve(r) - solve(l - ));
}
return ;
}

HDU 5787:K-wolf Number(数位DP)的更多相关文章

  1. 多校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 用作标记,当现在枚举的数小 ...

  2. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)

    题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...

  3. 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 ...

  4. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  5. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  6. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  7. 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 ...

  8. HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛

    题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...

  9. 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】

    Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  10. 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 ...

随机推荐

  1. android framework浅析_转

    Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...

  2. 第九篇 Replication:复制监视器

    本篇文章是SQL Server Replication系列的第九篇,详细内容请参考原文. 复制监视器允许你查看复制配置组件的健康状况.这一篇假设你遵循前八篇,并且你已经有一个合并发布和事务发布.启动复 ...

  3. XiaoShi657的留言板

    大家好,很荣幸能够借助此平台和大家分享.讨论编程技术! 有什么想对我说的请在这里留言吧

  4. 布置theano(Ubuntu14.04 LTS)

    引言 由于研究生阶段将会从事自然语言处理方向的研究,目前要用到机器学习和深度学习相关的框架,那应老师的要求,将要使用theano,由于theano官方文档中关于ubuntu下配置的问题并没有给出很好的 ...

  5. ubuntu14.04安装eclipse

    1.安装jdk7.x,参考上篇<Linux14.04安装JDK> 2下载eclipse.tar 3.sudo tar -zxvf eclipse-x-x-.tar.gz mv eclips ...

  6. c++l类

    c++类和C#中定义类的方法异同之处: 1. 相同处: 1.1.都需要使用 class标识: 1.2.都包含有成员:函数,属性: 1.3.都有private public protect 标识的成员 ...

  7. 一步一步学习Swift之(一):关于swift与开发环境配置

    一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...

  8. G面经prepare: Android Phone Unlock Pattern

    1 2 3 4 5 6 7 8 9 只有中间没有其他键的两个键才能相连,比如1可以连 2 4 5 6 8 但不能连 3 7 9 但是如果中间键被使用了,那就可以连,比如5已经被使用了,那1就可以连9 ...

  9. eclipse 改变字体大小

  10. JSP数据交互习题错误总结

    1:如果注册完页面有中文字符需要在提交后的页面显示注册信息,切记先把接受到的request的编码方式改为中文:request.setCharacterEncoding("utf-8" ...