动态规划学习系列——数位DP(练手一)
来源:互联网 发布:工商银行网络银行 编辑:程序博客网 时间:2024/04/30 17:42
大概了解了什么是数位DP,想做几道题练练手,于是找到了这道题:
题目链接:hdu 2089 不要62
题目大意是统计【A,B】区间内没有4并且没有62的数,因为有之前那道题的铺垫,很快想到了解决方法。
思路: 预处理一个dp数组,dp【i,j】代表最高位为 j 的 i 位数满足题述要求的的个数;然后分别统计【0,B】和【0,A-1】区间内满足条件的数——与之前那题类似,不过更简单了,具体来看代码吧:
代码
#include <cstdio>using namespace std;int n,m,dp[10][10],num[10],cnt,ans;int solve(int n){ cnt=0,ans=0; while(n){ //处理出n的每一位 num[++cnt]=n%10; n/=10; } num[cnt+1]=0; for(int k=cnt;k>=1;k--) { for(int i=0;i<num[k];i++) { if(i!=4&&!(num[k+1]==6&&i==2)) ans+=dp[k][i]; } if(num[k]==4||(num[k+1]==6&&num[k]==2)) break; } return ans;}int main(){ dp[0][0]=1; for(int i=1;i<=9;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) if(j!=4&&!(j==6&&k==2)) dp[i][j]+=dp[i-1][k]; while(scanf("%d %d",&n,&m)&&n&&m) { printf("%d\n",solve(m+1)-solve(n)); } return 0;}
从代码看,我们求解【0,B】区间内符合条件的数的方法依旧类似,从最高位(k = cnt)开始,每次取一位,统计最高位为 i 的数的个数(0 <= i <= num[k]),于是变成下面的代码:
for(int k=cnt;k>=1;k--){ for(int i=0;i<num[k];i++) { if(i!=4&&!(num[k+1]==6&&i==2)) ans+=dp[k][i]; } if(num[k]==4||(num[k+1]==6&&num[k]==2)) break;}
这里有一个需要注意的地方:如果之前的的数位已经出现不符合的情况了,那么我们就不应该继续统计下去!(因为这个WA了一次)
总结
理解过上一道数位DP之后,看这道题并不会那么吃力了,其实两道题本质上是差不多的,只是最后进行数位统计的部分有点不同(难怪当时TA说砍树那题是经典题)。
0 0
- 动态规划学习系列——数位DP(练手一)
- 动态规划学习系列——数位DP(练手二)
- 动态规划学习系列——数位DP(练手三)
- 动态规划学习系列——数位DP(练手四)
- 动态规划学习系列——数位DP(初识)
- 动态规划——数位dp入门(一)
- 动态规划学习系列——区间DP(一)
- 动态规划学习系列——划分DP(一)
- 动态规划——数位dp入门(二)
- 动态规划学习系列——区间DP(二)
- 动态规划学习系列——划分DP(二)
- 动态规划学习系列——划分DP(三)
- hdu4734 动态规划(数位dp)
- 动态规划_数位DP
- HDU 3652 B-number (动态规划-数位DP)
- 【动态规划07】HDU2089不要62(数位dp)
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
- 烤鸭的gerrit使用总结
- 单元测试之覆盖率浅谈
- 怎么查询局域网内全部电脑IP和mac地址等信息?
- 人脸识别之LBPH
- CCS3.1调试总结
- 动态规划学习系列——数位DP(练手一)
- 容器介绍之Vector
- iOS 开发实战-锁屏界面(手势解锁)
- iOS开发UI篇—iPad和iPhone开发的比较
- iOS 热敏打印机打印位图
- SAP EP实现文件下载功能
- IOS中获取各种文件的目录路径的方法
- 两个新认识
- UVA1598