hdu 2089 不要62

解法:

  数据范围很小,其实直接暴力就行,但是刚开始学数位dp,所以还是dp了一下,学习了一下数位dp的dfs写法,感觉简洁明了,但是要注意细节。

  dp[i][0]:前i位不含不吉利数的个数。

  dp[i][1]:前i位不含不吉利数且i+1位是6的个数。

  dp[i][2]:前i位含不吉利数的个数。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 10
 5 using namespace std;
 6 int bit[N];
 7 int dp[N][3];
 8 
 9 int dfs(int pos,int st,bool flag){
10     if(pos==0)return st==2;
11     if(flag&&dp[pos][st]!=-1)return dp[pos][st];
12     int ans=0;
13     int u=flag?9:bit[pos];
14     for(int d=0;d<=u;d++){
15         if(st==2||d==4||(st==1&&d==2))ans+=dfs(pos-1,2,flag||d<u);
16         else if(d==6)ans+=dfs(pos-1,1,flag||d<u);
17         else ans+=dfs(pos-1,0,flag||d<u);
18     }
19     if(flag)dp[pos][st]=ans;
20     return ans;
21 }
22 int solve(int n){
23     int len=0;
24     while(n){
25         bit[++len]=n%10;
26         n/=10;
27     }
28     return dfs(len,0,0);
29 }
30 int main(){
31     int n,m;
32     memset(dp,-1,sizeof(dp));
33     while(~scanf("%d%d",&n,&m)){
34         if(!(n||m))return 0;
35         printf("%d\n",m-n+1-(solve(m)-solve(n-1)));
36     }
37     return 0;
38 }

 

posted @ 2013-03-09 14:44  silver__bullet  阅读(2297)  评论(0编辑  收藏  举报