zoukankan      html  css  js  c++  java
  • HDU-2089 不要62 (数位DP)

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

    输入:输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。 
    输出:对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。 输入: 1 100 0 0
    输出:
    80

     代码是参考了一下某位大佬的思路的orz

    #include<iostream>
    #include<cstring>
    using namespace std;
    int aa[20];
    int dp[20][5];
    
    int dfs(int pos, bool state, bool limit)//state标记上一位是不是6 是6我们需要进行特判了
    {
        if (pos == 0)  return 1;
        //处理完数字个位 表明这个车牌是可以用的 可以先往下看
        //这毕竟是一个递归出口直接看容易晕
        //!limit 是因为当我们处理到limit时 处理方法不一样
        if (!limit&& dp[pos][state] != -1) //如果这一位开头的已经处理过了 直接返回结果就行
            return dp[pos][state];
        int up = limit ? aa[pos] : 9;
        //limint为假时下一位最高位为9 比如我们处理3xx的时候limit一直假
        int  ans = 0;
        for (int i = 0; i <= up; i++)
        {
            if (i != 4 && (i != 2 || state != true))//i不能为4 且相邻俩不是62
                ans += dfs(pos - 1, i == 6, limit && i == up);
                //这一位是不是最高位且上一位是不是取到最高位
                //为什么要看前一位是不是最高位呢 我们看处理三百二十里面有多少满足条件的时候肯定320-329都要看看  因为整个300-399都是小于525的
        }
        if (!limit) //不是最高位就记录
            dp[pos][state] = ans;//对此为的结果进行记录 方便以后再次利用
        //注意state是因为这一位是不是6 影响着后面的结果
        // return到最后返回了每一位的值
        return ans;
    }
    int solve(int t)
    {
        int s = 0;//s记录t的位数
        while (t != 0)
        {
            aa[++s] = t % 10;
            t /= 10;
        }
        return dfs(s, false, true);
    }
    int main()
    {
        int n, m;
        memset(dp, -1, sizeof(dp));
        while (cin >> n >> m&&(n!=0&&m!=0))
        {
            cout << solve(m) - solve(n - 1) << endl;
        }
    }
  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/wxx23-IOU/p/13567831.html
Copyright © 2011-2022 走看看