HDU 2089 不要62

状态表示:
dp[len][sta]表示当前第len位,上一位为last的情况下满足条件的数的个数。

int f[15][10];
int a[15];
int l,r;

int dfs(int len,int last,bool limit)
{
    if(!len) return 1;
    if(!limit && ~f[len][last]) return f[len][last];//如果没有限制且已求解,则直接返回,无需递归。
    int num=limit?a[len-1]:9;
    int res=0;
    for(int i=0;i<=num;i++)
    {
        if(last == 6 && i == 2) continue;
        if(i == 4) continue;
        res+=dfs(len-1,i,limit&&i==num);
    }
    if(!limit) f[len][last]=res;
    return res;
}

int dp(int x)`//求解[0...x]之间满足条件的个数 `
{
    int len=0;
    while(x)
    {
        a[len++]=x%10;
        x/=10;
    }
    return dfs(len,0,1);`//如果不包括0,此处减1即可`
}

int main()
{
    memset(f,-1,sizeof f);
    while(cin>>l>>r,l+r)
    {
        cout<<dp(r)-dp(l-1)<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-02-20 23:08  Dazzling!  阅读(24)  评论(0编辑  收藏  举报