zoukankan      html  css  js  c++  java
  • HDU3709 Balanced Number

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

    题目大意:

      定义一个数字上的某一个数位作为中枢,其他数位上的数乘上该数位到中枢的距离称为该数位上的权值。

      问在 ([x,y]) 中满足下述条件的数有多少个:

      即能够在数字上任取一个数位作为中枢,使得中枢左右所有数位的权值和相等。

    知识点:  数位DP

    解题思路:

      首先,对于每一个数(先不考虑 (0) ),如果它能找到满足条件的中枢,那么这种中枢只有一个。粗略证明:假设一个数有两个满足条件的不同位置的中枢,设为 (p_1), (p_2),(p_1<p_2),则 (p_1) 对应的左边的权值和必定小于或等于 (p_2) 对应的左边权值和,(p_1) 对应的右边的权值和必定大于或等于 (p_2) 对应的右边权值和,这两者都相等当且仅当这个数为 (0),但我们暂时不考虑 (0),故假设不成立,原命题得证。

      基于以上的结论,我们可以枚举中枢的位置,各自走一次 (DFS) 即可得出答案。

      另,无论中枢的位置在哪里,(0) 显然都会被计为满足条件,故要注意去重。

    AC代码:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long ll;
     5 ll dp[20][20][10000];   //dp[第几位是中点][位置][sum值]
     6 int a[20];
     7 ll dfs(int pos,int zhong,int sum,bool limit){
     8     if(pos==-1)
     9         return sum==0?1:0;
    10     if(sum<0)   return 0;
    11     if(!limit&&dp[zhong][pos][sum]!=-1) return dp[zhong][pos][sum];
    12     int up=limit?a[pos]:9;
    13     ll ans=0;
    14     for(int i=0;i<=up;i++){
    15         int tsum=(pos-zhong)*i+sum;
    16         ans+=dfs(pos-1,zhong,tsum,limit&&i==a[pos]);
    17     }
    18     if(!limit)  dp[zhong][pos][sum]=ans;
    19     return ans;
    20 }
    21 ll solve(ll x){
    22     if(x<0) return 0;
    23     int pos=0;
    24     while(x){
    25         a[pos++]=x%10;
    26         x/=10;
    27     }
    28     ll ret=0;
    29     for(int i=0;i<pos;i++){
    30         ret+=dfs(pos-1,i,0,true);
    31         ret--;
    32     }
    33     return ret+1;
    34 }
    35 int main(){
    36     memset(dp,-1,sizeof(dp));
    37     int T;
    38     ll x,y;
    39     scanf("%d",&T);
    40     while(T--){
    41         scanf("%lld%lld",&x,&y);
    42         printf("%lld
    ",solve(y)-solve(x-1));
    43     }
    44     return 0;
    45 }
    “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
  • 相关阅读:
    AC自动机模板
    hdu 6034 贪心模拟 好坑
    UVA 10870
    hdu 2604 递推 矩阵快速幂
    hdu 3117 Fibonacci Numbers 矩阵快速幂+公式
    hdu 1575 Tr A 矩阵快速幂
    POJ_1151 扫描线+离散化+线段树
    HDU_2227 求不减子序列的个数(树状数组+DP)
    深夜敲模板_5——KMP
    深夜敲模板_4——无向图的割顶和桥
  • 原文地址:https://www.cnblogs.com/Blogggggg/p/8543805.html
Copyright © 2011-2022 走看看