[数位DP]Hdu 2089——不要62
来源:互联网 发布:湖南才能网络 编辑:程序博客网 时间:2024/06/03 20:24
Ps:博主又水blog,是佳龙大神叫我干的。
题目梗概
一个数被称为吉利(手动滑稽)当且仅当其不含4和62。
多次询问一个区间的吉利的个数。
解题思路
这题应该算是数位DP的裸题吧。
考虑求出一个固定长度出现的吉利数,然后分别考虑每一位就可以了。
设
转移方程就不难求出:
f[i][0]=9*f[i-1][0]-f[i-1][1];//除了4当前位有9种选择,但要排除62的情况 f[i][1]=f[i-1][0];//只有首位为2的选择 f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][2]*10;//可以有4和62的选择,如果已经不是吉利数则可以放任意数
接下来按位讨论一下就可以了。
#include<cstdio>using namespace std;int f[10][3],n,m;void work(){ f[0][0]=1; for (int i=1;i<=6;i++){ f[i][0]=9*f[i-1][0]-f[i-1][1]; f[i][1]=f[i-1][0]; f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][2]*10; }}int check(int x){ int ans=x,pd=0,tot=0,a[10]; while(x!=0){ a[++tot]=x%10; x=x/10; } a[tot+1]=0; for (int i=tot;i>=1;i--){ ans-=a[i]*f[i-1][2]; if (pd) ans-=a[i]*f[i-1][0];else{ if (a[i]>6) ans-=f[i-1][1]; if (a[i]>4) ans-=f[i-1][0]; if (a[i+1]==6&&a[i]>2) ans-=f[i][1]; } if (a[i]==4||(a[i+1]==6&&a[i]==2)) pd=1; } return ans;}int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); work(); while (scanf("%d%d",&n,&m)){ if (n==0&&m==0) return 0; printf("%d\n",check(m+1)-check(n)); }}
阅读全文
0 0
- HDU 2089——不要62(数位DP)
- hdu(2089)——不要62(数位dp)
- HDU 2089 不要62——数位dp
- [数位DP]Hdu 2089——不要62
- hdu 2089 不要62 数位DP
- hdu 2089 不要62 数位dp
- hdu 2089 不要62 数位dp
- hdu 2089 不要62(数位dp入门)
- [HDU 2089]不要62[数位DP]
- hdu 2089 不要62(数位dp)
- Hdu 2089 不要62 (暴力/数位dp)
- hdu 2089 不要62 (数位DP)
- HDU 2089 不要62 数位dp入门
- hdu 2089(不要62)数位DP
- 【数位DP】【HDU 2089】不要62
- hdu 2089 不要62(数位DP)
- hdu 2089 不要62 --- 数位dp
- 数位DP小记 + HDU 2089 不要62
- 网络的概念
- uboot移植2
- 2016年湖南省第十二届大学生计算机程序设计竞赛
- 【启发】leetcode
- hdu 2147 kiki's game
- [数位DP]Hdu 2089——不要62
- EK算法
- 【思维-链表】hdu 6058
- 树回归
- 又是毕业季II
- java泛型出现原因分析
- 容器对路径的处理、servlet特性
- 路径最优问题
- mysql 修改密码的四个方法