hdu 2089 不要62 --- 数位dp

2014-11-24 08:50:42 · 作者: · 浏览: 0

简单题

bool six保存上一位是不是6


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
           #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int dp[15][2],num[15],n,m; int dfs(int len,bool six,bool flag) { if(len<0) return 1; if(!flag&&dp[len][six]!=-1) return dp[len][six]; int p=flag num[len]:9; int ans=0,i; for(i=0;i<=p;i++) { if(i==4||(i==2&&six)) continue; ans+=dfs(len-1,i==6,flag&&i==p); } if(!flag) dp[len][six]=ans; return ans; } int cal(int x) { int l=0; while(x) { num[l++]=x%10; x/=10; } return dfs(l-1,0,1); } int main() { memset(dp,-1,sizeof dp); while(scanf("%d%d",&n,&m)&&(n||m)) { printf("%d\n",cal(m)-cal(n-1)); } return 0; }