zoukankan      html  css  js  c++  java
  • HDU 3709 Balanced Number (数位DP)

    题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数。

    析:数位DP,dp[i][[j][k]表示 前 i 位以 j 为支点,还差 k 平衡,枚举 j 就好。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 1e5 + 5;
    const int mod = 1e9 + 7;
    const int dr[] = {-1, 0, 1, 0};
    const int dc[] = {0, 1, 0, -1};
    const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline int Min(int a, int b){ return a < b ? a : b; }
    inline int Max(int a, int b){ return a > b ? a : b; }
    inline LL Min(LL a, LL b){ return a < b ? a : b; }
    inline LL Max(LL a, LL b){ return a > b ? a : b; }
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    }
    LL dp[20][20][1500];
    int a[20];
    
    LL dfs(int pos, int dot, int balance, bool ok){
        if(!pos)  return balance == 0;
        if(balance < 0)  return 0;
        LL &ans = dp[pos][dot][balance];
        if(!ok && ans >= 0)  return ans;
    
        LL res = 0;
        int n = ok ? a[pos] : 9;
        for(int i = 0; i <= n; ++i){
            res += dfs(pos-1, dot, balance+(pos-dot)*i, ok && i == n);
        }
        if(!ok)  ans = res;
        return res;
    }
    
    LL solve(LL n){
        int len = 0;
        while(n){
            a[++len] = n % 10;
            n /= 10;
        }
        LL ans = 0;
        for(int i = 1; i <= len; ++i)
            ans += dfs(len, i, 0, true);
    
        return ans - len;//除去全是0的情况
    }
    
    int main(){
        memset(dp, -1, sizeof dp);
        LL x, y;
        int T;  cin >> T;
        while(T--){
            scanf("%lld %lld", &x, &y);
            printf("%lld
    ", solve(y)-solve(x-1));
        }
        return 0;
    }
    
  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5893919.html
Copyright © 2011-2022 走看看