站点一览:
- hdu 2089"不要62"
- hdu 4734"F(X)"
- poj 3252"Round Numbers"
- hdu 3709"Balanced Number"
题解:
题目过于简单,不再赘述。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 7 int a,b; 8 int digit[10]; 9 int dp[10][2];//dp[i][0]:位置i的前一个位置不为6的总方案数;dp[i][1]正好相反 10 11 int DFS(int curPos,int preNum,int isSix,bool limit) 12 { 13 if(curPos == -1) 14 return 1; 15 if(!limit && dp[curPos][isSix] != -1) 16 return dp[curPos][isSix]; 17 18 int up=limit ? digit[curPos]:9; 19 int ans=0; 20 for(int i=0;i <= up;++i) 21 { 22 if((preNum == 6 && i == 2) || i == 4) 23 continue; 24 ans += DFS(curPos-1,i,i == 6,limit&& i == digit[curPos]); 25 } 26 if(!limit) 27 dp[curPos][isSix]=ans; 28 return ans; 29 } 30 int Solve(int x) 31 { 32 int k=0; 33 while(x) 34 { 35 digit[k++]=x%10; 36 x /= 10; 37 } 38 return DFS(k-1,0,0,true); 39 } 40 41 int main() 42 { 43 while(~scanf("%d%d",&a,&b) && a+b) 44 { 45 mem(dp,-1); 46 printf("%d\n",Solve(b)-Solve(a-1)); 47 } 48 return 0; 49 }