标签:
题意:求n~m间的数中,多少不带4和62的数。
思路:数位dp
#include<iostream> #include<stdio.h> using namespace std; int dp[15][10];//dp[i][j]表示长度为i,最高位为j的windy数的个数 void init(){ memset(dp,0,sizeof(dp)); int i,j,k; for(j=0;j<10;++j)dp[1][j]=1; for(i=2;i<=10;++i) for(j=0;j<10;++j){ for(k=0;k<=j-2;++k)dp[i][j]+=dp[i-1][k]; for(k=j+2;k<10;++k)dp[i][j]+=dp[i-1][k]; } } int bit[15]; int calc(int n){ int len=0,i,tmp=n; while(n){ bit[++len]=n%10; n/=10; } bit[len+1]=0; bool flag=false; int ans=0; for(i=len;i>=1;--i){ ans+=dp[i-1][2]*bit[i];//注意这个位置,求的是前缀+当前位置 if(flag)ans+=dp[i-1][0]*bit[i]; else{//有3中情况 if(bit[i]>4)ans+=dp[i-1][0]; if(bit[i+1]==6&&bit[i]>2)ans+=dp[i][1]; if(bit[i]>6)ans+=dp[i-1][1]; } if(bit[i]==4||bit[i+1]==6&&bit[i]==2)flag=true; } if(flag)++ans;//加上n本身 return tmp-ans; } int main(){ init(); int a,b; while(~scanf("%d%d",&a,&b)){ printf("%d\n",calc(b)-calc(a-1)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/bofengyu/p/4757453.html