HDU2089 一段区间内数字没有62和4的个数
来源:互联网 发布:阿里云建立远程连接 编辑:程序博客网 时间:2024/06/14 22:12
C - 不要62
HDU - 2089杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
1 1000 0
80
自己写的第一道数位dp
dp[i][j] i表示剩余要处理的位数(比如5位数45623 i一开始是5 到0就是都处理完了就回溯 也可以开始是4到-1回溯 ) j(0,1,2)0代表吉利 1代表上一位是6 2表示不吉利 j是表示上一层传下来的状态
dfs(int dex,int dt,int p) dex剩余要处理的位数 dt(012)状态 p(01)是否取到了最高位 (抄cjs的)
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <cstdio> #include <climits> #include <cmath> #define INF 0x3f3f3f3f using namespace std; int n,m; int dp[11][8]; int digits[11]; int dfs(int dex,int dt,int p){ //计算不吉利的数字个数 int ans=0; if(dex==0) return dt==2; if(dp[dex][dt]!=-1&&!p) return dp[dex][dt]; int u=p?digits[dex]:9; for(int i=0;i<=u;i++){ if(i==4||dt==1&&i==2||dt==2) ans+=dfs(dex-1,2,p&&i==u); else if(i==6) ans+=dfs(dex-1,1,p&&i==u); else ans+=dfs(dex-1,0,p&&i==u); } if(!p) dp[dex][dt]=ans; return ans; } int digit(int num){ int k=0; while(num){ digits[++k]=num%10; num/=10; } return dfs(k,0,1); } int main(){ memset(dp,-1,sizeof(dp)); while(scanf("%d%d",&n,&m)==2&&(n||m)){ int k1=digit(m),k2=digit(n-1); printf("%d\n",m-n+1-(k1-k2)); } return 0; }或者直接求吉利数字的个数(网上看到不知道是哪位大佬写的)
#include <iostream>#include <algorithm>#include <cstring>using namespace std;int n,m,dp[20][2],digit[20];int dfs(int len,int six,int top)//len剩余处理的位数 上一个数字是否为6 top是否取到最高位{if (!len) return 1;if (!top&&dp[len][six]!=-1) return dp[len][six];int ans=0,u=top?digit[len]:9;for (int i=0;i<=u;++i){if (i==4||six&&i==2) continue;//跳过4和62ans+=dfs(len-1,i==6,top&&i==u);}if (!top) dp[len][six]=ans;return ans;}int slove(int n){int len=0;while (n){digit[++len]=n%10;n/=10;}return dfs(len,0,1);}int main(){memset(dp,-1,sizeof(dp));while (scanf("%d%d",&n,&m)>0&&(n||m)){printf("%d\n",slove(m)-slove(n-1));}}
0 0
- HDU2089 一段区间内数字没有62和4的个数
- 求一段区间内素数的个数
- 查询区间内不同数字的个数 lydsy1878
- 输入一段字符,判断字符串中字母的个数,数字的个数和其他字符个数
- 区间内素数的个数
- C#在一段数字区间内随机生成若干个互不相同的随机数
- 计算一段区间内的所有素数
- hdu2089 不要62和4
- leetcode--求区间内的元素个数
- 判断区间内的素数个数
- 数字和的个数
- 求一段连续整数区间的和
- 统计给定整数M和N区间内素数的个数
- BZOJ 1799 self 同类分布(数位dp,区间各位数字和能整除原数的数字个数)
- excel统计区间内个数
- 判断区间内素数个数
- 统计输入的整数区间内回文数的个数
- 整数区间内整数的因子的个数
- SpringMVC数据回显
- 动态规划基础之矩阵取数问题 51nod1083
- Request对象的主要方法有哪些?
- JavaScript parseInt() 函数
- [HDUOJ] 1004 Let the Balloon Rise
- HDU2089 一段区间内数字没有62和4的个数
- Java 中带参无返回值方法的使用
- POJ 1733 Parity game 带权并查集
- java的equals和hashCode
- POJ 2421 Constructing Roads 最小生成树
- 哈希表内容的详细整合
- python 中numpy.transpose()的用法
- List和数组之间的相互转换
- 虚拟机上实现linux自动上网