zoukankan      html  css  js  c++  java
  • 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
    ", solve(r, k) - solve(l - 1, k));
        }
        return 0;
    }
    more crazy more get!
  • 相关阅读:
    DOM总结
    BOM总结
    备忘录设计模式
    策略模式
    迭代器模式
    观察者模式
    装饰模式
    脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
    ajax传输中文乱码解决方法
    java Serialization and Deserializaton
  • 原文地址:https://www.cnblogs.com/wethura/p/9899289.html
Copyright © 2011-2022 走看看