HDU 5787 K-wolf Number

来源:互联网 发布:织梦power by dedecms 编辑:程序博客网 时间:2024/05/16 15:30

题意

求区间[l,r]中有多少个数不存在连续k位含有相同的数位。

思路

比较裸的数位DP,但是因为刚开始没有想好思路就开始写后来调试挺长的时间。
因为K比较小,所以我们直接加4维状态分别表示前面取的四个数,每次加下一个的时候根据K判断一下就好了。有些不好处理的地方是010这种有前导零的,那么前导零我们统一用11这个数位取不到的数来表示就可以了。

代码

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>using namespace std;#define LL long long#define Lowbit(x) ((x)&(-x))#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1|1#define MP(a, b) make_pair(a, b)const int INF = 0x3f3f3f3f;const int MOD = 1000000007;const int maxn = 1e6 + 10;const double eps = 1e-8;const double PI = acos(-1.0);typedef pair<int, int> pii;LL dig[25];LL l, r;int k;LL dp[25][12][12][12][12];LL dfs(int cur, int e, int a, int b, int c, int d, int flag){    //    if (cur <= 0)    {        //printf("%d %d %d %d %d %d\n", cur, e, a, b, c, d);        return flag;    }    if (!e && dp[cur][a][b][c][d] != -1)        return dp[cur][a][b][c][d];    int end = e ? dig[cur] : 9;    LL ans = 0;    for (int i = 0; i <= end; i++)    {        if (k == 2)        {            if (d == i) continue;            ans += dfs(cur - 1, i == end && e, b, c, d, i || flag ? i : 11, i || flag);        }        else if (k == 3)        {            if ((i == d || i == c)) continue;            ans += dfs(cur - 1, i == end && e, b, c, d, i || flag ? i : 11, i || flag);        }        else if (k == 4)        {            if ((i == d || i == c || i == b)) continue;            ans += dfs(cur - 1, i == end && e, b, c, d, i || flag ? i : 11, i || flag);        }        else if (k == 5)        {            if ((i == d || i == c || i == b || i == a)) continue;            //printf("nei   %d %d %d %d %d %d %d\n", i, end, (i == end) && e, a, b, c, d);            ans += dfs(cur - 1, i == end && e, b, c, d, i || flag ? i : 11, i || flag);        }    }    if (!e) dp[cur][a][b][c][d] = ans;    return ans;}LL Solve(LL x){    if (x == 0) return 0;    int len = 0;    while (x)    {        dig[++len] = x % 10;        x /= 10;    }    return dfs(len, 1, 11, 11, 11, 11, 0);}int main(){    //freopen("H:\\in.txt","r",stdin);    //freopen("H:\\out.txt","w",stdout);    while (scanf("%I64d%I64d%d", &l, &r, &k) != EOF)    {        memset(dp, -1, sizeof(dp));        printf("%I64d\n", Solve(r) - Solve(l - 1));    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 双侧附睾头囊肿怎么办 睾丸上面长疙瘩很痒都抓烂了怎么办 睾丸小引起精子数量少怎么办 睾丸发育不完全精子存活率低怎么办 踢到睾丸很痛怎么办 兔子的睾丸烂了怎么办 梗阻性无精穿刺取得精子不好怎么办 甲状腺做完穿刺后是恶性怎么办 硬了之后睾丸痛怎么办 腋下胯间颜色深怎么办 当兵前上班有社保怎么办 别人背后害我我怎么办 左侧胸明显大于右侧胸怎么办 婴儿拉大便次数多怎么办 公鸽子不会踩蛋怎么办 生殖器套东西取不下来怎么办 婴儿成蛋蛋的皮好长怎么办 丈夫总要害自己该怎么办 脚背踢肿了怎么办很疼 踢沙袋脚背伤了怎么办 脚y子烂了怎么办 掐喉咙那会痒会咳嗽怎么办 掐到婴儿脖子了怎么办 孩子胳膊不小心烫破皮了怎么办 孩子嘴角磕破了怎么办 电话不小心拒接了怎么办 手机微信不小心碰到语言英文怎么办 手机微信不小心碰到英文说话怎么办 不小心碰到宝宝卤门怎么办 不小心碰到婴儿头顶囟门怎么办 重要部位被踢了怎么办 吃了带刺的葡萄怎么办 小孩子老是去厕所大便怎么办 家人偷了我的钱怎么办 小孩打闹踢到要害怎么办 腿上汗毛孔没开都是点点怎么办 脸蛋澡巾擦破了怎么办 婴儿后背用擦澡巾擦红了怎么办 搓澡皮肤搓破了怎么办 搓背搓的脖子红痒怎么办 上班迟到1个小时怎么办