设为首页 加入收藏

TOP

hdu3709 Balanced Number 数位dp
2015-07-20 17:24:07 来源: 作者: 【 】 浏览:2
Tags:hdu3709 Balanced Number数位

题意:定义一个数为“balanced number” 当其满足存在一个数位pos(平衡点),在pos左边的数位的值乘与pos位的距离值的总和等于右

边的数位的值乘与pos位的距离值的总和,给定一个区间[l , r],求区间内有多少个balanced number。

思路:设dp[ pos ][ i ][ j ]表示平衡点在i位的情况下,当前考虑pos位,之前已形成的力矩为j(数乘以距离平衡点的距离,在平衡点左

边的为正,右边的为负),之后(pos + 1)位于之前位组合使最后平衡(力矩为0)的数的个数,详见代码:

/*********************************************************
  file name: hdu3709.cpp
  author : kereo
  create time:  2015年01月24日 星期六 15时27分47秒
*********************************************************/
#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
        #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              using namespace std; typedef long long ll; const int sigma_size=26; const int N=20; const int MAXN=1500+50; const int inf=0x3fffffff; const double eps=1e-8; const int mod=100000000+7; #define L(x) (x<<1) #define R(x) (x<<1|1) #define PII pair
             
               #define mk(x,y) make_pair((x),(y)) int bit[N]; ll dp[N][N][MAXN]; //dp[pos][i][j]表示在平衡点为i的情况下,当前考虑pos位,之前已形成的力矩为j,之后(pos+1)位与之前位组合使最后平衡的个数 ll dfs(int pos,int o,int st,int flag){ if(pos == -1) return st == 0; if(flag && dp[pos][o][st]!=-1) return dp[pos][o][st]; int x=flag ? 9 : bit[pos]; ll ans=0; for(int i=0;i<=x;i++){ int nst=st+(pos-o)*i; if(nst<0) //力矩为负直接continue continue; ans+=dfs(pos-1,o,nst,flag || i
              
               

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 2091 空心三角形 下一篇hdu4311 曼哈顿距离

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)