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 }