题目链接: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. 第七篇 SQL Server代理作业活动监视器

    本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...

  2. Vue.2.0.5-深入响应式原理

    大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue 最显著的一个功能是响应系统 -- 模型只是普通对象,修改它则更新视图.这会让状态管理变得非常简单且直观,不过理解它的原理以避免一些常见的陷阱也 ...

  3. oracle恢复备份数据

    sqlplus链接数据库: 1.sqlplus 用户名/密码@IP地址/数据库名称 2.sqlplus 用户名/密码@数据库名称 注:第二种方法要在tnsnames.oRA文件中配置数据库名称 链接断 ...

  4. openId 列表

    http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html 根据OpenID列表群发[订阅号不可用,服务号认证后可用] ...

  5. Java基础之访问文件与目录——列出目录内容(ListDirectoryContents)

    控制台程序,列出目录的全部内容并使用过滤器来选择特定的条目. import java.nio.file.*; import java.io.IOException; public class List ...

  6. linux:磁盘的分割、检验、格式化与挂载

    新增一颗磁碟: 1.对磁碟进行分割,以建立可用的partition 2.对该分割槽partition进行格式化(format),以建立系统可用的filesystem 3.若要仔细点,可对刚刚建立的fi ...

  7. Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)

    优酷观看地址:http://v.youku.com/v_show/id_XNzM2Nzc2MTIw.html 通过这个小游戏,我们能够接触到物理系统(SKPhysicsBody,physicsWorl ...

  8. Leetcode: Water and Jug Problem && Summary: GCD求法(辗转相除法 or Euclidean algorithm)

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...

  9. vs2015社区版不支持installshield

    开始学习vs了 下一步就是在这个平台上提升技术咯. 写了老师上课讲的算法 生成了个VB程序结果不能在别的电脑上运行 .幸好我自己测试了下.要是直接拿去学校不是很~ 然后我就想到当初接触易语言时候的搞静 ...

  10. navicat的简单应用

    首先  创建连接 主机名 : 可以不写名称随意 主机名/IP地址:localhost或者127.0.0.1 都是本机的意思 端口:默认3306   尽量不要改怕与其余端口重复,如有重名端口系统会报错 ...