hdu 2089 不要62

来源:互联网 发布:wpf treeview数据绑定 编辑:程序博客网 时间:2024/05/07 12:33

Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input
输入的都是整数对n、m(0

这里写代码片#include<iostream>#include<cstring>#include<string>#include<algorithm>using namespace std;int a[1000000];int fun(int x){    while(x)    {        if(x%10==4)        return 0;        if(x%100==62)        return 0;        x/=10;    }    return 1;} void init() {    for(int i=1;i<=1e6;i++)    {        if(fun(i))        a[i]=a[i-1]+1;        else        a[i]=a[i-1];     } }int main(){    a[0]=0;    init();    int n,m;    while(cin>>n>>m&&n&&m)    {        cout<<a[m]-a[n-1]<<endl;    }    return 0;}

数位dp解法:
dp[i][j] 表示符合i位数,并最高为j的所有解;//需留意此处;
所以当j!=4时,dp[i][j]=dp[i-1][0]+dp[]i-1][1]+…………+dp[i-1][9];
列如dp[2][5] 是2999到2000 之间的解
代码如下:

这里写代码片#include<iostream>#include<cstring>#include<string>using namespace std;const int maxn=20;int dp[maxn][maxn];int num(int n){    int len=0;//代表当前所在的位数     int digit[11];//每个数的每一位数字     while(n)    {        digit[++len]=n%10;        n/=10;    }    digit[len+1]=0;//高一位取0     int ans=0;     for(int i=len;i>=1;i--)    {        for(int j=0;j<digit[i];j++)         if(j!=4&&(digit[i+1]==6&&j==2))         ans+=dp[i][j];         if(digit[i]==4||(digit[i+1]=3&&digit[i]==7))         break;    }    return ans;}int main() {    memset(dp,0,sizeof(dp));    dp[0][0]=1;    for(int i=1;i<=10;i++)//代表数的位数:     {        for(int j=0;j<10;j++)//i位最高位是j;         for(int k=0;k<10;k++)//i-1位最高位的情况         if(j!=4&&!(j==6&&K==2))        dp[i][j]+=dp[i-1][k];    }        int l,r;        while(cin>>l>>r)        cout<<num(r+1)-num(l)<<endl;    return 0;}
2 0
原创粉丝点击