数位dp

来源:互联网 发布:企业网络组建毕业论文 编辑:程序博客网 时间:2024/05/01 10:16
//hdu2089
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>#include<string>#include<set>#include<map>#include<queue>#include<vector>#include<stack>using namespace std;#define ll long long#define cl(a,b) memset(a,b,sizeof(a))#define N 50005#define MAXN 100005int dp[10][3];//dp[i][0],表示不存在不吉利数字//dp[i][1],表示不存在不吉利数字,且最高位为2//dp[i][2],表示存在不吉利数字void init(){    cl(dp,0);    dp[0][0]=1;    for(int i=1;i<=6;i++)    {        dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//把上一位不存在不吉利数字加上0~9除了4共9个,减去上一位是2        dp[i][1]=dp[i-1][0];//上一位不存在不吉利数字在在最高位加2        dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];//已经存在不吉利数字*10,不存在不吉利数字,且最高位为2加上一个6,,,不存在不吉利数字加上一个4    }}int solve(int n){    int l=0,bit[10];    int temp=n;    while(n)    {        bit[++l]=n%10;        n/=10;    }    bit[l+1]=0;    int ans=0;    bool flag=false;    for(int i=l;i>0;i--)    {        ans+=dp[i-1][2]*bit[i];        if(flag)            ans+=dp[i-1][0]*bit[i];        if(!flag&&bit[i]>4)//高位可能含有4            ans+=dp[i-1][0];        if(!flag&&bit[i+1]==6&&bit[i]>2)//高位含有6后一个出现2            ans+=dp[i][1];        if(!flag&&bit[i]>6)//高位可能出现6,要把后面最高位为2计入            ans+=dp[i-1][1];        if(bit[i]==4||(bit[i+1]==6&&bit[i]==2))flag=true;    }    //cout<<ans<<endl;    return temp-ans;}int main(){    int n,m;    init();    while(~scanf("%d%d",&n,&m))    {        if(n==0&&m==0)break;        printf("%d\n",solve(m+1)-solve(n));    }    return 0;}

0 0
原创粉丝点击