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;
    }
  • 相关阅读:
    Angularjs 设置全局变量的3种方法
    prevent to do sth 与 prevent sb (from) doing 用法
    软件测试技术对程序员的重要性
    Javascript中setTimeout()以及clearTimeout( )的使用
    Javascript异步编程的常用方法
    软件设计原则总结
    为sublime Text3 安装插件JS Format
    javascript中 if(变量)和if(变量==true)的区别
    Ping 命令
    ipconfig
  • 原文地址:https://www.cnblogs.com/widsom/p/9306413.html
Copyright © 2011-2022 走看看