HDU2089 不要62[数位DP]
来源:互联网 发布:赌球外围软件 编辑:程序博客网 时间:2024/06/06 01:05
A - 不要62
HDU - 2089统计[n,m]中不含4 或者 62的数有多少个,首先判断有4就直接continue,当前函数记录前一位数字为多少,如果前一位为6且当前位为2也是不符合的,也是直接continue。所以我们只要知道不大于m能构造出多少个这样的数和不大于n-1(因为统计中包括了n)能构造出多少个,用sum(m)-sum(n-1)就可以求出这个[n,m]中存在多少个符合条件的数了。
状态转移的话,dp[i][j] 第一维表示当前位置,第二维表示状态,仅有两种状态,0表示前一位不是6,1表示前一位是6。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<algorithm>#include<queue>#include<stack>#include<set>#include<map>#include<vector>using namespace std;typedef long long ll;const int N=20;int num[N];ll dp[N][2];ll dfs(int pos,int pre,int sta,bool limit){if (pos==-1)return 1;if (!limit && dp[pos][sta]!=-1)return dp[pos][sta];int up=limit?num[pos]:9;ll cnt=0;for (int i=0 ; i<=up ; ++i){if (i==4 || (pre==6 && i==2))continue;cnt+=dfs(pos-1,i,i==6,limit && i==num[pos]);}if (!limit)dp[pos][sta]=cnt;return cnt;}ll divi(int n){int pos=0;while (n){num[pos++]=n%10;n/=10;}return dfs(pos-1,-1,0,1);}int main(){int n,m;memset(dp,-1,sizeof(dp));while (~scanf("%d%d",&n,&m) && (n+m)){ printf("%lld\n",divi(m)-divi(n-1));}return 0;}
阅读全文
0 0
- 【数位DP】 hdu2089 不要62
- 【数位DP】不要62 HDU2089
- HDU2089:不要62(数位DP)
- hdu2089 不要62 数位dp
- hdu2089 不要62 (数位DP)
- HDU2089 不要62 数位DP
- Hdu2089 - 不要62 - 数位dp
- hdu2089 不要62 数位dp
- 【数位DP】【HDU2089】不要62
- [HDU2089] 不要62 && 数位DP
- hdu2089 不要62 数位dp
- HDU2089 不要62 (数位DP)
- HDU2089 不要62 数位DP
- HDU2089 不要62【数位DP】
- hdu2089不要62【数位dp】
- hdu2089 不要62 数位DP
- hdu2089 不要62(数位DP)
- hdu2089 不要62(数位dp)
- Arduino Uno 无声无息的开关 固态继电器(四引脚)的实验
- pagehelper连接查询分页问题
- Android如何去掉顶部标题栏
- EasyNVR实现网页/微信播放RTSP摄像机HLS直播时出现起播等待问题的优化过程
- 在eclipse中添加新的tomcat,没法添加,next按钮呈灰色,点击不了
- HDU2089 不要62[数位DP]
- android系统添加内置APP(自带.so)
- 架构师成长之路
- 闲谈:移动端车牌识别技术在行业中的应用
- 几种开源数据库
- BZOJ 2176: Strange string 最小表示法
- PHP 5.3.8 成功连接 SQL Server 2005
- 学习Git(分布式版本控制系统)——基础篇
- 集合及map体系