题目链接: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. web文件上传的实现

    1,html页面,上传使用input type=file控件,其所在的form必须加上enctype="multipart/form-data" <form role=&qu ...

  2. C# 模拟并发

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 当然,题外话说多了,咱进入正题! 在处理大数据的时候,经常会发生并发,并发的情况发生后,会出现数据污读,从而产生脏数据. 首 ...

  3. Mysql note

    from w3cschool.com 1,modify the segment of table alter table table_name add/drop var_name [var_type] ...

  4. 寻找第K大的数

    在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...

  5. jquery 操作select

    jQuery("#select_id").change(function(){}); // 1.为Select添加事件,当选择其中一项时触发 var checkValue = jQ ...

  6. C++Primer 第十章

    //1.标准库算法不仅可以应用于容器,还可以应用于内置数组,指针. //2.大多数算法都定义在头文件algorithm中.标准库还在头文件numeric中定义了一组数值泛型算法. //3.算法本身不会 ...

  7. [转]JAVA程序员一定知道的优秀第三方库(2016版)

    原文地址:http://blog.csdn.net/zxc123e/article/details/51418163 几乎每个程序员都知道要“避免重复发明轮子”的道理——尽可能使用那些优秀的第三方框架 ...

  8. Java用native2ascii命令做unicode编码转换

    背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...

  9. ligerui_ligerTree_001_第一个“树”效果

    折叠.展开.有复选框.没有复选框: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 效果图: <%@ page languag ...

  10. -Xloggc:log/gc.log 指定GC log的位置

    -Xloggc:log/gc.log指定GC log的位置,以文件输出帮助开发人员分析问题