• hdu3709_数位dp(同hdu3652)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709

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

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <ctime>
     8 #include <queue>
     9 #include <list>
    10 #include <set>
    11 #include <map>
    12 using namespace std;
    13 #define INF 0x3f3f3f3f
    14 typedef long long LL;
    15 int bit[20];
    16 LL dp[20][20][2000];
    17 
    18 LL solve(int len, int mid, int blan, int flag)
    19 {
    20     LL sum = 0;
    21     if(len == 0) 
    22         return blan == 0;
    23     if(blan < 0)
    24         return 0;
    25     if(flag && dp[len][mid][blan] >= 0)
    26         return dp[len][mid][blan];
    27     int te = flag ? 9 : bit[len];
    28     for(int i = 0; i <= te; i++)
    29     {
    30         int Blan = blan + (len - mid) * i;
    31         sum += solve(len - 1, mid, Blan, flag || i < te );
    32     }
    33     if(flag)
    34         dp[len][mid][blan] = sum;
    35     return sum;
    36 }
    37 int main()
    38 {
    39     int T;
    40     LL x, y;
    41     scanf("%d", &T);
    42     while(T--)
    43     {
    44         scanf("%I64d %I64d", &x, &y);
    45         if(x == 0 && y == 0)
    46         {
    47             printf("1
    ");
    48             continue;
    49         }
    50         x--;
    51         memset(bit, 0, sizeof(bit));
    52         memset(dp, -1, sizeof(dp));
    53         int len = 0;
    54         while(x)
    55         {
    56             bit[++len] = x % 10;
    57             x /= 10;
    58         }
    59         LL res = 1-len;//排除掉00,000,0000....这些情况 
    60         for(int i = 1; i <= len; i++)
    61             res += solve(len, i, 0, 0);
    62         memset(bit, 0, sizeof(bit));
    63         memset(dp, -1, sizeof(dp));
    64         len = 0;
    65         while(y)
    66         {
    67             bit[++len] = y % 10;
    68             y /= 10;
    69         }
    70         LL res2 = 1-len;
    71         for(int i = 1; i <= len; i++)
    72             res2 += solve(len, i, 0, 0);
    73         res = res2 - res;
    74         printf("%I64d
    ", res);
    75     }
    76     return 0;
    77 }
    View Code
  • 相关阅读:
    OO第四次暨期末总结
    OO第九到十一次作业小结
    OO第五到七次作业小结
    OO前三次作业阶段小结
    数据预处理相关
    Latex+VScode安装
    python学习网站+查询网站
    arcgis画图中添加带箭头的直线
    在ArcGIS 中标注中竖排文字
    vs2015使用fopen时遇到unsafe问题
  • 原文地址:https://www.cnblogs.com/luomi/p/5777061.html
Copyright © 2020-2023  润新知