• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
镂空的行尸
   首页       联系   管理    订阅  订阅

K-wolf Number (数位DP)

  题意:求区间内有多少个数满足条件:任意相邻的k个数位都不相等。

  思路:老套路

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int bit[24];
ll dp[24][11][11][11][11][6];

bool mycheck(int p[], int k, int newin) {
    for(int i = 0; i < k - 1;i ++)
        if(p[i] == newin) return false;
    return true;
}

ll dfs(int now, int p[], int k, bool flag) {
    if(now <= -1) return 1;
    if(!flag && dp[now][p[0]][p[1]][p[2]][p[3]][k] != -1)
        return dp[now][p[0]][p[1]][p[2]][p[3]][k];

    int step = flag ? bit[now] : 9;
    ll ret = 0;
    for(int i = 0; i <= step; i ++) {
        if(mycheck(p, k, i)){
            int newp[4];
            if(i == 0 && p[0] == 10){
                newp[0] = newp[1] = newp[2] = newp[3] = 10;
            }else{
                newp[3] = p[2];newp[2] = p[1];
                newp[1] = p[0];newp[0] = i;
            }
            ret += dfs(now - 1, newp, k, flag && (i == step));
        }
    }
    if(!flag) dp[now][p[0]][p[1]][p[2]][p[3]][k] = ret;
    return ret;
}

ll solve(ll n, int k){
    if(n == 0) return 1;
    int cnt = 0;
    while(n){
        bit[cnt ++] = n % 10;
        n /= 10;
    }
    int p[] = {10, 10, 10, 10};
    return dfs(cnt - 1, p, k, true);
}

int main(){
    ll l, r; int k;
    memset(dp, -1, sizeof(dp));
    while(~scanf("%lld%lld%d", &l, &r, &k)){
        printf("%lld\n", solve(r, k) - solve(l - 1, k));
    }
    return 0;
}

 

more crazy more get!
posted @ 2018-11-03 01:41  镂空的行尸  阅读(261)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3