• hdu 2089 不要62(数位dp入门)


    http://acm.hdu.edu.cn/showproblem.php?pid=2089

    数位dp(dfs)

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int dp[34][3];
     8 int bit[34];
     9 
    10 int dfs(int len,int is,int p)
    11 {
    12     if (!len) return 1;
    13     if (!p&&dp[len][is]>=0) return dp[len][is];
    14     int cut=0,mx=p ? bit[len] : 9;
    15     for (int i=0;i<=mx;i++)
    16     {
    17         if (i==4||is&&i==2) continue;
    18         cut+=dfs(len-1,i==6,p&&i==mx);
    19     }
    20     return p ? cut : dp[len][is]=cut;
    21 }
    22 
    23 int f(int n)
    24 {
    25     int len=0;
    26     while (n)
    27     {
    28         bit[++len]=n%10;
    29         n/=10;
    30     }
    31     memset(dp,-1,sizeof(dp));
    32     return dfs(len,0,1);
    33 }
    34 
    35 int main()
    36 {
    37     int n,m;
    38     while (~scanf("%d%d",&n,&m)&&n)
    39     cout<<f(m)-f(n-1)<<endl;
    40     return 0;
    41 }

    数位dp

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 
     6 int dp[10][3];
     7 
     8 void Init()
     9 {
    10     memset(dp,0,sizeof(dp));
    11     dp[0][0]=1;
    12     for (int i=1;i<=7;i++)
    13     {
    14         dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
    15         dp[i][1]=dp[i-1][0];
    16         dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];
    17     }
    18 }
    19 
    20 int f(int n)
    21 {
    22    int i=1,sum=0,s[10],flag=0,x=n;
    23    while (n)
    24    {
    25        s[i++]=n%10;
    26        n/=10;
    27    }
    28    s[i]=0;
    29    for (;i;i--)
    30    {
    31        sum+=dp[i-1][2]*s[i];
    32        if (flag) sum+=dp[i-1][0]*s[i];
    33        else
    34        {
    35            if (s[i]>4) sum+=dp[i-1][0];
    36            if (s[i]>6) sum+=dp[i-1][1];
    37            if (s[i+1]==6&&s[i]>2) sum+=dp[i][1];
    38        }
    39        if (s[i]==4||(s[i]==2&&s[i+1]==6)) flag=1;
    40    }
    41    return x-sum;
    42 }
    43 
    44 int main()
    45 {
    46     Init();
    47     int n,m;
    48     while (~scanf("%d%d",&n,&m)&n)
    49     {
    50         cout<<f(m+1)-f(n)<<endl;
    51     }
    52     return 0;
    53 }
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 
     6 int dp[10][3];
     7 
     8 void Init()
     9 {
    10     memset(dp,0,sizeof(dp));
    11     dp[0][0]=1;
    12     for (int i=1;i<=7;i++)
    13     {
    14         dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
    15         dp[i][1]=dp[i-1][0];
    16         dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];
    17     }
    18 }
    19 
    20 int f(int n)
    21 {
    22    int i=1,sum=0,s[10],flag=0,x=n;
    23    while (n)
    24    {
    25        s[i++]=n%10;
    26        n/=10;
    27    }
    28    s[i]=0;
    29    for (;i;i--)
    30    {
    31        sum+=dp[i-1][2]*s[i];
    32        if (flag) sum+=dp[i-1][0]*s[i];
    33        else
    34        {
    35            if (s[i]>4) sum+=dp[i-1][0];
    36            if (s[i]>6) sum+=dp[i-1][1];
    37            if (s[i+1]==6&&s[i]>2) sum+=dp[i][1];
    38        }
    39        if (s[i]==4||(s[i]==2&&s[i+1]==6)) flag=1;
    40    }
    41    return x-sum;
    42 }
    43 
    44 int main()
    45 {
    46     Init();
    47     int n,m;
    48     while (~scanf("%d%d",&n,&m)&n)
    49     {
    50         cout<<f(m+1)-f(n)<<endl;
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    CF854C Planning优先队列|set
    暑假集训-8.9总结
    暑假集训-8.6总结
    AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂
    暑假集训-8.5总结
    KMP 和 扩展KMP
    暑假集训-8.4总结
    暑假集训-8.3总结
    2019牛客暑期多校第二场题解FH
    AcWing 196. 质数距离
  • 原文地址:https://www.cnblogs.com/pblr/p/5251816.html
Copyright © 2020-2023  润新知