zoukankan      html  css  js  c++  java
  • HDU 5787 K-wolf Number

    5787

    思路:

    数位dp

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long 
    #define pb push_back
    #define mem(a, b) memset(a, b, sizeof(a))
    
    LL dp[25][12][12][12][12];
    int a[25];
    int cnt = 0, k;
    LL dfs(int pos, int a1, int a2, int a3, int a4, bool limit, bool zero) {
        if(pos == -1) {
            return 1;
        }
        if(!limit) {
            if(k == 2) {
                if(~dp[pos][a4][0][0][0]) return dp[pos][a4][0][0][0];
            }
            else if(k == 3) {
                if(~dp[pos][a3][a4][0][0]) return dp[pos][a3][a4][0][0];
            }
            else if(k == 4) {
                if(~dp[pos][a2][a3][a4][0]) return dp[pos][a2][a3][a4][0];
            }
            else if(k == 5) {
                if(~dp[pos][a1][a2][a3][a4]) return dp[pos][a1][a2][a3][a4];
            }
        }
        int up = 9;
        if(limit) up = a[pos];
        LL ans = 0;
        for (int i = 0; i <= up; i++) {
            if(k == 2) {
                if(i != a4) {
                    if(zero&&i==0)ans += dfs(pos-1, a2, a3, a4, 11, limit&&i==up, zero&&i==0);
                    else ans += dfs(pos-1, a2, a3, a4, i, limit&&i==up, zero&&i==0);
                }
            }
            else if(k == 3) {
                if(i != a3 && i != a4) {
                    if(zero&&i==0)ans += dfs(pos-1, a2, a3, a4, 11, limit&&i==up, zero&&i==0);
                    else ans += dfs(pos-1, a2, a3, a4, i, limit&&i==up, zero&&i==0);
                }
            }
            else if(k == 4) {
                if(i != a2 && i != a3 && i != a4) {
                    if(zero&&i==0)ans += dfs(pos-1, a2, a3, a4, 11, limit&&i==up, zero&&i==0);
                    else ans += dfs(pos-1, a2, a3, a4, i, limit&&i==up, zero&&i==0);
                }
            }
            else if(k == 5) {
                if(i != a1 && i != a2 && i != a3 && i != a4) {
                    if(zero&&i==0)ans += dfs(pos-1, a2, a3, a4, 11, limit&&i==up, zero&&i==0);
                    else ans += dfs(pos-1, a2, a3, a4, i, limit&&i==up, zero&&i==0);
                }
            } 
        }
        if(!limit) {
            if(k == 2) {
                dp[pos][a4][0][0][0] = ans;
            }
            else if(k == 3) {
                dp[pos][a3][a4][0][0] = ans;
            }
            else if(k == 4) {
                dp[pos][a2][a3][a4][0] = ans;
            }
            else if(k == 5) {
                dp[pos][a1][a2][a3][a4] = ans;
            }
        }
        return ans;
    } 
    LL solve(LL n) {
        if(n == 0) return 1;
        cnt = 0;
        mem(dp, -1);
        while(n) a[cnt++] = n%10, n /= 10;
        return dfs(cnt-1, 11, 11, 11, 11, 1, 1); 
    }
    int main(){
        LL L, R;
        while(~ scanf("%lld %lld %d", &L, &R, &k)){
            printf("%lld
    ", solve(R) - solve(L-1));
        }
        return 0;
    }
  • 相关阅读:
    Java线程面试题 Top 50
    深入理解java内存模型
    线程池的理解
    Thread的理解
    ThreadLocal的理解
    排序算法(简)
    排序算法
    【Java集合源码剖析】LinkedHashmap源码剖析
    vsftp上传文件权限问题
    xp 通过注册表修改环境变量
  • 原文地址:https://www.cnblogs.com/widsom/p/9306413.html
Copyright © 2011-2022 走看看