码迷,mamicode.com
首页 > 其他好文 > 详细

数位dp

时间:2019-12-07 01:26:06      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:span   set   long   mes   memset   break   scanf   return   sizeof   

//hdu2089 
#include "cstdio"
#include "cstring"
#include "iostream"
#include "algorithm"
using namespace std;
int cont;
long long dig[10001]; 
long long dp[20][2][2];
int dfs(int pos,int six,int flag){
      if (pos<0)return 1;
      long long ans=0;
      if (dp[pos][six][flag]!=-1)return dp[pos][six][flag];
      for (int i = 0; i <= 9;i++){
          if (i>dig[pos]&&flag==1)break;
          if (i==2&&six==1)continue;
          if (i==4)continue;
          ans=ans+dfs(pos-1,i==6,flag&&i==dig[pos]);
      }
      return dp[pos][six][flag]=ans;
}
long long s(long long x){
     if (x<0)return 0;
     memset(dp,-1,sizeof(dp));
     cont=0;
     while (x){
         dig[cont++]=x%10;
         x=x/10;
     }
     return dfs(cont-1,0,1);
}
int main (){
    long long  n , m;
    while (~scanf ("%lld%lld",&n,&m)){
        if (n==0&&m==0)break;
        printf ("%lld\n",s(m)-s(n-1));
    }
}

 

数位dp

标签:span   set   long   mes   memset   break   scanf   return   sizeof   

原文地址:https://www.cnblogs.com/AChappy/p/12000137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!